Что такое stdClass в PHP?

907

Пожалуйста, определите, что такое stdClass.

Теги:
stdclass

16 ответов

710
Лучший ответ

stdClass - это пустой PHP-класс, похожий на Object в Java или object в Python (Edit: но не используется в качестве универсального базового класса, спасибо @Ciaran за указание этого).

Он полезен для анонимных объектов, динамических свойств и т.д.

Простой способ рассмотреть StdClass - это альтернатива ассоциативному массиву. См. Этот пример ниже, который показывает, как json_decode() позволяет получить экземпляр StdClass или ассоциативный массив. Также, но не показано в этом примере, SoapClient::__soapCall возвращает экземпляр StdClass.

<?php
//Example with StdClass
$json = '{ "foo": "bar", "number": 42 }';
$stdInstance = json_decode($json);
echo $stdInstance->foo . PHP_EOL; //"bar"
echo $stdInstance->number . PHP_EOL; //42
//Example with associative array
$array = json_decode($json, true);
echo $array['foo'] . PHP_EOL; //"bar"
echo $array['number'] . PHP_EOL; //42

Дополнительные примеры см. В разделе Динамические свойства в PHP и StdClass.

  • 5
    возможно он использовал mysql_fetch_object. это создает экземпляр stdlcass, если я не ошибаюсь.
  • 60
    Это не совсем базовый класс в том смысле, как Java-объект, смотрите мой ответ ниже.
Показать ещё 6 комментариев
1054

stdClass - это всего лишь "пустой" класс, который используется при передаче других типов объектам. Несмотря на то, что говорят два других ответа, stdClass не базовый класс для объектов в PHP. Это можно продемонстрировать довольно легко:

class Foo{}
$foo = new Foo();
echo ($foo instanceof stdClass)?'Y':'N';
// outputs 'N'

Я не верю в концепцию базового объекта в PHP

  • 3
    что означает стандарт?
  • 40
    стандартный = стандартный -
Показать ещё 7 комментариев
80

stdClass - еще одна отличная функция PHP. Вы можете создать анонимный класс PHP. Давайте посмотрим пример.

$page=new stdClass();
$page->name='Home';
$page->status=1;

теперь подумайте, что у вас есть еще один класс, который будет инициализироваться с помощью объекта страницы и выполнить базу на нем.

<?php
class PageShow {

    public $currentpage;

    public function __construct($pageobj)
    {
        $this->currentpage = $pageobj;
    }

    public function show()
    {
        echo $this->currentpage->name;
        $state = ($this->currentpage->status == 1) ? 'Active' : 'Inactive';
        echo 'This is ' . $state . ' page';
    }
}

Теперь вам нужно создать новый объект PageShow с объектом страницы.

Здесь нет необходимости писать новый шаблон класса для этого, вы можете просто использовать stdClass для создания класса на лету.

    $pageview=new PageShow($page);
    $pageview->show();
  • 3
    пустой класс с полезными функциями, работающими со строками, а также его лучший стандарт кодирования
  • 1
    Это было бы так же, как использование массива. Фактически STDclass генерируется во время жонглирования типа преобразования массива в объект.
Показать ещё 3 комментария
60

Также стоит отметить, что объект stdClass может быть создан из использования json_decode().

  • 5
    Правда. Я часто использую json_encode и json_decode для преобразования массива в объект в массив, когда это необходимо.
  • 6
    $ x = json_decode (json_encode ($ object), True) будет декодировать объект в массив, но это небезопасно в двоичном формате. По сути, если это не открытый текст, он может сломаться в JSON.
Показать ещё 4 комментария
23

Аналогично,

$myNewObj->setNewVar = 'newVal'; 

выводит объект stdClass - auto casted

Я нашел это сегодня, набрав:

$GLOBASLS['myObj']->myPropertyObj->myProperty = 'myVal';

Круто!

  • 9
    Но это должно поднять E_NOTICE
  • 3
    @Petah Только в PHP 5.3+, хотя верно? Но да, это плохая практика наверняка.
Показать ещё 1 комментарий
21

Используя stdClass, вы можете создать новый объект с его собственными свойствами. Рассмотрим следующий пример, который представляет детали пользователя как ассоциативный массив.

$array_user = array();
$array_user["name"] = "smith john";
$array_user["username"] = "smith";
$array_user["id"] = "1002";
$array_user["email"] = "[email protected]";

Если вам нужно представить те же детали, что и свойства объекта, вы можете использовать stdClass, как показано ниже.

$obj_user = new stdClass;
$obj_user->name = "smith john";
$obj_user->username = "smith";
$obj_user->id = "1002";
$obj_user->email = "[email protected]";

Если вы являетесь разработчиком Joomla, обратитесь за помощью к этому примеру в документах Joomla для дальнейшего понимания.

7

На самом деле я попытался создать пустой stdClass и сравнил скорость с пустым классом.

class emp{}

затем продолжилось создание 1000 stdClasses и emps... пустые классы были выполнены примерно за 1100 микросекунд, а stdClasses заняли 1700 микросекунд. Поэтому я думаю, что лучше создать свой собственный фиктивный класс для хранения данных, если вы хотите использовать объекты для этого так плохо (массивы намного быстрее для записи и чтения).

  • 22
    очевидно, разница вызвана разницей в длине имени. если вы называете класс "averylongclassnamefornoapparentreason", его создание займет намного больше времени. так что пойди разберись.
  • 26
    Хм ... преждевременная оптимизация. Я бы предпочел находить сложные запросы SQL или другие узкие места в сети, если я действительно обеспокоен скоростью, а не трачу время на экономию 600 микросекунд. На самом деле, я бы предпочел сначала проверить, находится ли javascript в нижнем колонтитуле, а не в голове, чем заботиться, если один из них на 600 микросекунд быстрее другого.
Показать ещё 6 комментариев
6

stdClass не является анонимным классом или анонимным объектом

Ответы здесь включают выражения, что stdClass - анонимный класс или даже анонимный объект. Это не правда.

stdClass - обычный регулярный предопределенный класс. Вы можете проверить это с помощью оператора или функции instanceof get_class. Здесь ничего особенного. PHP использует этот класс при переносе других значений в объект.

Во многих случаях, когда программисты используют stdClass, массив лучше, из-за полезных функций и того факта, что этот usecase представляет структуру данных, а не реальный объект.

3

Если вы хотите быстро создать новый объект для хранения некоторых данных о книге. Вы сделали бы что-то вроде этого:

$book = new stdClass;
$book->title = "Harry Potter and the Prisoner of Azkaban";
$book->author = "J. K. Rowling";
$book->publisher = "Arthur A. Levine Books";
$book->amazon_link = "http://rads.stackoverflow.com/amzn/click/0439136369";

Подробнее см. сайт http://www.webmaster-source.com/2009/08/20/php-stdclass-storing-data-object-instead-array/.

2

Используемые объекты stdClass

StdClass позволяет создавать анонимные классы и с помощью литья объектов вы также можете получить доступ к ключам ассоциативного массива в стиле ООП. Так же, как вы получили доступ к обычным свойствам объекта.

пример

class Example {

  private $options;

  public function __construct(Array $setup)
  {
    // casting Array to stdClass object
    $this->options = (object) $setup;

    // access stdClass object in oop style - here transform data in OOP style using some custom method or something...
    echo $this->options->{'name'}; // ->{'key'}
    echo $this->options->surname;  // ->key
  }

}

$ob1 = new Example(["name" => "John", "surname" => "Doe"]);

будет эхо

Джон Доу

2

В справочнике php.net есть несколько подробных объяснений и примеров, сделанных пользователями того, что такое stdClass, мне особенно нравится этот http://php.net/manual/en/language.oop5.basic.php#92123, https://stackoverflow.com/questions/1434368/how-to-define-an-empty-object-in-php.

stdClass - это объект PHP по умолчанию. У stdClass нет свойств, методов или родителя. Он не поддерживает магические методы и реализует нет интерфейсов.

Когда вы бросаете скаляр или массив как объект Object, вы получаете экземпляр StdClass. Вы можете использовать stdClass всякий раз, когда вам нужен общий объект экземпляр.

stdClass НЕ является базовым классом! Классы PHP не автоматически наследуют из любого класса. Все классы являются автономными, если только они явно не расширить другой класс. PHP отличается от многих объектно-ориентированных языков в этом отношении.

Вы можете определить класс, который расширяет stdClass, но вы не получите, поскольку stdClass ничего не делает.

1

Также стоит отметить, что при использовании Casting вам фактически не нужно создавать объект, как в ответе @Bandula. Вместо этого вы можете просто передать свой массив объекту и вернуть stdClass. Например:

$array = array(
    'Property1'=>'hello',
    'Property2'=>'world',
    'Property3'=>'again',
);

$obj = (object) $array;
echo $obj->Property3;

Output: again

  • 0
    Любить это. Гораздо чище!
1

- это способ, которым избежать остановки интерпретации script когда в классе есть какие-то данные, но к сожалению, этот класс не был определен

Пример:

 return $statement->fetchAll(PDO::FETCH_CLASS  , 'Tasks');

Здесь данные будут помещены в предопределенные "Задачи". Но, если бы мы сделали код следующим образом:

 return $statement->fetchAll(PDO::FETCH_CLASS );

то php поставит приводит к .

просто говорит, что: look, у нас есть хорошие ДЕТИ [Объекты] Здесь, но без Родителей. Итак, мы отправим их в детский дом Care Home :

1

stClass - пустой класс, созданный самим php, и должен использоваться только php, потому что это не просто "пустой" класс, php использует stdClass для преобразования массивов в стиль объекта если вам нужно использовать stdClass, я рекомендую два лучших варианта:  1- использовать массивы (намного быстрее, чем классы)  2- сделайте свой собственный пустой класс и используйте его

//example 1
$data=array('k1'=>'v1' , 'k2'=>'v2',....);

//example 2
//creating an empty class is faster than instances an stdClass
class data={}
$data=new data();
$data->k1='v1';
$data->k2='v2';

что заставляет кого-то думать об использовании стиля объекта вместо стиля массива???

0

Пожалуйста, учтите, что 2 пустых stdClasses не являются строго равными. Это очень важно при написании ожиданий насмешек.

php > $a = new stdClass();
php > $b = new stdClass();
php > var_dump($a === $b);
bool(false)
php > var_dump($a == $b);
bool(true)
php > var_dump($a);
object(stdClass)#1 (0) {
}
php > var_dump($b);
object(stdClass)#2 (0) {
}
php >
0

Вы также можете использовать object для создания массивов для объекта по вашему выбору:

Class Example
{
   public $name;
   public $age;
}

Теперь, чтобы создать объект типа Example и инициализировать его, вы можете сделать любой из них:

$example = new Example();
$example->name = "some name";
$example->age = 22;

ИЛИ

$example = new Example();
$example = (object) ['name' => "some name", 'age' => 22];

Второй метод в основном полезен для инициализации объектов со многими свойствами.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню