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

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


person Keira Nighly    schedule 31.05.2009    source источник


Ответы (17)


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.

person Alex Martelli    schedule 31.05.2009
comment
возможно он использовал mysql_fetch_object. который создает экземпляр stdlcass, если я не ошибаюсь. - person Galen; 31.05.2009
comment
Это не совсем базовый класс в сравнении с Java Object, см. Мой ответ ниже. - person Ciaran McNulty; 14.06.2009
comment
Надеюсь, вы знаете, что объект не является производным классом всех объектов в Python ... По крайней мере, до тех пор, пока вы не будете вынуждены наследовать от объекта в Python 3.0. - person monokrome; 22.09.2010
comment
Я думаю, люди должны сказать, что stdClass - это что-то вроде конструкции {} в JavaScript. - person Earth Engine; 18.04.2013
comment
Сэр, ваш ответ частично неверен, потому что статья неверна. Единственное (и это тоже неправильно), что дает вам расширение этого класса, - это возможность ввести подсказку, то есть function(StdClass $a, array $params) v.s. проверка, является ли $a объектом и instanceof. - person Dejan Marjanović; 16.04.2014
comment
Я согласен с Earth Engine, я думаю о stdClass, как об объекте JSON. - person neurosnap; 23.08.2014
comment
Вы не приводите здесь краткий пример, почему бы не сослаться на документацию php.net? - person Pmpr; 24.11.2016

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

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

Я не верю, что в PHP есть концепция базового объекта

person Ciaran McNulty    schedule 14.06.2009
comment
Это служебный класс! Кстати, это настоящий комментарий! - person Gustav; 18.02.2014
comment
Собственно, первое предложение после фрагмента кода отвечает на вопрос. - person MauganRa; 13.10.2014
comment
+1. Еще одним важным фактором, определяющим разницу между классом Object в Java и stdClass в PHP, являются динамические свойства. Вам не разрешено просто определять динамические свойства (или переменные) в объекте Java Object, однако вам разрешено делать это в объекте stdClass в PHP. - person Miro Markaravanes; 29.10.2014
comment
@Miro Markaravanes: Динамические атрибуты могут быть назначены любому классу в PHP, а не только stdClass. - person StanE; 12.03.2015
comment
Как бы мне хотелось, чтобы у меня был базовый класс, который я мог бы модифицировать. Тогда я мог бы добавить stdClass- ›methods (), и моя жизнь стала бы немного счастливее. - person Gerry; 09.07.2015
comment
@Gerry теперь вы можете использовать для этого анонимные классы PHP7 :) - person igorsantos07; 04.11.2016
comment
@ igorsantos07 не совсем так, я хотел изменить базовый класс, чтобы после этого я мог вызывать - ›методы () для любого объекта. В любом случае, я больше не использую PHP, так что это больше не проблема. - person Gerry; 05.11.2016

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();
person Mrinmoy Ghoshal    schedule 08.12.2012
comment
пустой класс с полезными функциями, которые работают со строками, а также его лучший стандарт кодирования - person borrel; 03.05.2013
comment
Это было бы то же самое, что использовать массив. Фактически, класс STDclass генерируется во время манипулирования типами, как преобразование массива в объект. - person varuog; 13.06.2013
comment
Исправьте опечатку в коде: ($ this- ›currentpage-› name == 1) должно быть ($ this- ›currentpage-› status == 1) - person Enriqe; 22.08.2014
comment
Вы можете создать анонимный класс PHP - это не анонимный класс. Вы можете использовать instanceof, get_class, ... - person John Smith; 05.03.2016
comment
Этот ответ особенно сбивает с толку сейчас, когда PHP фактически имеет анонимные классы, которые сильно отличаются от stdClass. - person IMSoP; 26.03.2018

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

person mdpatrick    schedule 11.10.2011
comment
Правда. Я часто использую json_encode и json_decode для преобразования массива в объект в массив, когда это необходимо. - person pinkal vansia; 05.09.2013
comment
$ x = json_decode (json_encode ($ object), True) декодирует объект в массив, но это небезопасно для двоичного кода. По сути, если это не открытый текст, он может сломаться в JSON. - person simontemplar; 22.10.2013
comment
@simontemplar В PHP не следует писать True. Логические значения - это нижний регистр true или false. - person BadHorsie; 19.02.2016
comment
@BadHorsie Говорит кто? В руководстве нет, на самом деле в нем используются все прописные буквы и заглавные буквы в демонстрациях, а не все строчные. Это не JavaScript. - person simontemplar; 25.02.2016
comment
@simontemplar В руководстве нет, но есть в PSR-2, поэтому если вы следуете каким-либо стандартам, это должно быть строчными буквами. Конечно, если вы хотите написать это таким образом, это правильно, но вы должны следовать стандартам. Ручная документация для логических значений будет очень старой, вероятно, написанной до того, как были сформированы стандарты. Давайте будем честными, PHP изначально был написан как полный беспорядок без каких-либо стандартов (см. Широкий спектр используемых соглашений об именах переменных / функций / объектов). Честно говоря, я никогда не видел PHP-кода, в котором разработчик использовал бы ваш формат. - person BadHorsie; 25.02.2016
comment
Я следую PSR-2, за исключением True / False / Null и помещаю открывающие скобки в их собственные строки для классов. В остальном мне все равно. Однако, если я когда-либо редактирую чужой код, я следую тому стандарту, который они используют (если есть, обычно нет), а если я этого не делаю, то делаю PSR-2 правильным образом. Есть много ужасного кода с множеством других проблем, которые меня беспокоит меньше всего, так что использование заглавных букв в трех ключевых словах. - person simontemplar; 26.02.2016

Используя 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 для дальнейшего понимания.

person Bandula Dharmadasa    schedule 06.04.2015

Так же,

$myNewObj->setNewVar = 'newVal'; 

дает объект stdClass - автоматически приведенный

Я узнал об этом сегодня, написав с ошибкой:

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

Прохладный!

person Codename-Steeve-Knight    schedule 19.05.2010
comment
Но это должно вызвать E_NOTICE - person Petah; 27.02.2012
comment
@Petah Только в PHP 5.3+, правда? Но да, это определенно плохая практика. - person ChristoKiwi; 08.07.2014

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

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

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

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

person John Smith    schedule 05.03.2016

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

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

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

Output: again

person Antony    schedule 11.01.2018
comment
Любить это. Намного чище! - person WebSpanner; 25.11.2018

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

class emp{}

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

person Sage    schedule 23.03.2013
comment
видимо разница вызвана разницей в длине имени. если вы вызовете класс averylongclassnamefornoapparentreason, его создание займет намного больше времени. так что пойди разберись. - person Sage; 23.03.2013
comment
Хммм ... преждевременная оптимизация. Я бы предпочел найти сложные SQL-запросы или другие узкие места в сети, если меня действительно волнует скорость, чем тратить время на экономию 600 микросекунд. На самом деле, я бы лучше сначала проверил, находится ли javascript в нижнем колонтитуле, а не в голове, чем заботился бы о том, что один на 600 микросекунд быстрее, чем другой. - person Ardee Aram; 30.03.2013
comment
1000 - это слишком мало для надежного теста. Попробуй миллиард. - person rightfold; 21.07.2014
comment
В мире PHP почти всегда лучше использовать массивы. - person Vahid Amiri; 06.06.2016
comment
^ Определенно не так. Array hell - это кошмар при работе в команде над большим проектом. - person Dave; 22.06.2017
comment
@DavieDave Боже ... Массив? - person hanshenrik; 08.11.2017
comment
Я бы не сказал, что даже отдаленно точный сказать, что массивы всегда лучше. Заметьте хоть немного правду. - person mopsyd; 11.12.2017
comment
В дополнение к упомянутому беспокойству о том, что 1k итераций едва ли можно квалифицировать как эталонный тест, вам также нужно будет сделать это на реальном серверном оборудовании и лучше всего в условиях реальных приложений. - person nico gawenda; 29.11.2018

используемые объекты 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"]);

будет эхом

Джон Доу

person DevWL    schedule 23.04.2017

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

$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://www.amazon.com/dp/0439136369/";

Проверьте сайт - http://www.webmaster-source.com/2009/08/20/php-stdclass-storing-data-object-instead-array/ для получения дополнительных сведений.

person Niladri Banerjee - Uttarpara    schedule 14.10.2015

В руководстве по php.net есть несколько подробных объяснений и примеров, предоставленных пользователями того, что такое stdClass, мне особенно нравится этот http://php.net/manual/en/language.oop5.basic.php#92123, https://stackoverflow.com/a/1434375/2352773.

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

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

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

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

person Danijel    schedule 19.06.2016

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

Пример :

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

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

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

тогда php поместит результаты в stdclass.

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

person Nasir Nasrallah    schedule 29.09.2017

Имейте в виду, что 2 пустых класса stdClass не строго равны. Это очень важно при написании издевательских ожиданий.

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 >
person jakub wrona    schedule 13.03.2018
comment
Поскольку это НЕ один и тот же экземпляр, следовательно, они не могут равняться друг другу. Строгое сравнение работы классов с идентификацией экземпляра. Каждый экземпляр любого класса имеет уникальный идентификатор. - person Bednic; 23.04.2019

Причина, по которой у нас есть stdClass, заключается в том, что в PHP нет способа отличить нормальный массив от связанного массива (например, в Javascript у вас есть {} для объекта и [] для массива, чтобы различать их).

Таким образом, это создает проблему для пустых объектов. Возьмем, к примеру, это.

PHP:

$a = [1, 2, 3]; // this is an array
$b = ['one' => 1, 'two' => 2]; // this is an associate array (aka hash)
$c = ['a' => $a, 'b' => $b]; // this is also an associate array (aka hash)

Предположим, вы хотите, чтобы JSON закодировал переменную $ c

echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': {one: 1, two: 2}}

Теперь предположим, что вы удалили все ключи из $b, сделав его пустым. Поскольку $b теперь пуст (вы удалили все ключи, помните?), Он выглядит как [], который может быть либо массивом, либо объектом, если вы посмотрите на него.

Поэтому, если вы снова выполните json_encode, результат будет другим

echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': []}

Это проблема, потому что мы знаем b, который должен был быть ассоциированным массивом, но PHP (или любая функция вроде json_encode) - нет.

Так что на помощь приходит stdClass. Возьмем тот же пример снова

$a = [1, 2, 3]; // this is an array
$b = (object) ['one' => 1, 'two' => 2]; // this makes it an stdClass
$c = ['a' => $a, 'b' => $b]; // this is also an associate array (aka hash)

Итак, теперь, даже если вы удалите все ключи из $b и сделаете его пустым, поскольку это stdClass, это не имеет значения, и когда вы json_encode его, вы получите следующее:

echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': {}}

Это также причина, по которой json_encode и json_decode по умолчанию возвращают stdClass.

 $c = json_decode('{"a": [1,2,3], "b": {}}', true); //true to deocde as array
 // $c is now ['a' => [1,2,3], 'b' => []] in PHP
 // if you json_encode($c) again your data is now corrupted
person supersan    schedule 24.01.2020

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

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

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

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

OR

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

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

person Vahid Amiri    schedule 28.01.2016

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';

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

person Sherif Eldeeb    schedule 11.08.2017