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

Ответы:

785

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 для большего количества примеров.

Алекс Мартелли
источник
7
возможно он использовал mysql_fetch_object. это создает экземпляр stdlcass, если я не ошибаюсь.
Гален
69
Это не совсем базовый класс в том смысле, как Java-объект, смотрите мой ответ ниже.
Кьяран МакНалти
1
Я надеюсь, вы знаете, что объект не является производным классом «всех» объектов в Python ... По крайней мере, пока вы не будете вынуждены наследовать от объекта в Python 3.0
монокром
11
Я думаю, что люди должны сказать, что stdClass - это что-то вроде {}конструкции JavaScript .
Земной двигатель
Сэр, ваш ответ частично неверен, потому что статья неверна. Единственное (и это тоже неправильно) расширение этого класса дает вам возможность набрать подсказку, т.е. function(StdClass $a, array $params)против проверки, $aявляется ли объект и instanceof.
Деян Марьянович
1114

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

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

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

Кьяран МакНалти
источник
4
что означает стандарт?
Адам Уэйт
47
стандартный =
Томас Прадо
1
Это служебный класс! Кстати, это настоящий комментарий!
Густав
16
На самом деле, первое предложение после фрагмента кода отвечает на вопрос.
MauganRa
2
@Miro Markaravanes: Динамические атрибуты могут быть назначены любому классу в PHP, а не только stdClass.
Стан
95

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 с Page Object.

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

    $pageview=new PageShow($page);
    $pageview->show();
Мринмой Гошал
источник
3
пустой класс с полезными функциями, работающими со строками, а также его лучший стандарт кодирования
borrel
1
Это было бы так же, как использование массива. Фактически, STDclass генерируется во время жонглирования типа преобразования массива в объект.
варуог
1
Исправьте опечатку в своем коде: ($ this-> currentpage-> name == 1) должно быть ($ this-> currentpage-> status == 1)
Enriqe
7
«Вы можете создать анонимный класс PHP» - это не анонимный класс . Вы можете использовать instanceof, get_class, ...
Джон Смит
2
Этот ответ особенно сбивает с толку сейчас, когда PHP на самом деле имеет анонимные классы , которые сильно отличаются от stdClass.
IMSoP
59

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

mdpatrick
источник
5
Правда. Я часто использую json_encode и json_decode для преобразования массива в объект в массив, когда это необходимо.
Pinkal Vansia
6
$ x = json_decode (json_encode ($ object), True) будет декодировать объект в массив, но это небезопасно в двоичном формате. По сути, если это не открытый текст, он может сломаться в JSON.
simontemplar
@simontemplar В PHP вы не должны писать True. Булевы строчные trueили false.
BadHorsie
2
@simontemplar Руководство не делает, но PSR-2 делает, поэтому, если вы следуете каким-либо стандартам, оно должно быть в нижнем регистре. Конечно, если вы хотите написать это так, как это правильно, но вы должны следовать стандартам. Ручная документация для логических значений будет очень старой, вероятно, написанной до того, как стандарты будут сформированы. Давайте будем честными, PHP изначально был написан как полный беспорядок без каких-либо стандартов (см. Широкий диапазон используемых соглашений о присвоении имен функциям / функциям / объектам). Честно говоря, я никогда не видел ни одного PHP-кода, где разработчик использовал ваш формат.
BadHorsie
2
Я следую PSR-2 за исключением True / False / Null и ставлю открывающие скобки на своих строках для классов. Кроме этого, мне просто все равно. Однако, если я когда-либо редактирую чужой код, я следую тому стандарту, который они используют (если вообще есть), и, в случае неудачи, делаю PSR-2 «правильным» способом. Существует множество божьих ужасных кодов с множеством других проблем, из-за которых капитализация трех ключевых слов - это наименьшее из моих беспокойств.
simontemplar
26

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

$array_user = array();
$array_user["name"] = "smith john";
$array_user["username"] = "smith";
$array_user["id"] = "1002";
$array_user["email"] = "smith@nomail.com";

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

$obj_user = new stdClass;
$obj_user->name = "smith john";
$obj_user->username = "smith";
$obj_user->id = "1002";
$obj_user->email = "smith@nomail.com";

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

Бандула Дхармадаса
источник
24

Точно так же,

$myNewObj->setNewVar = 'newVal'; 

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

Я узнал об этом сегодня по орфографии:

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

Круто!

Codename-Steeve-Knight
источник
9
Но это должно поднять E_NOTICE
Петах
3
@Petah Только в PHP 5.3+, хотя верно? Но да, это плохая практика наверняка.
ChristoKiwi
15

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

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

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

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

Джон Смит
источник
8

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

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

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

Output: again

Antony
источник
Любить это. Гораздо чище!
WebSpanner
7

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

class emp{}

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

шалфей
источник
22
очевидно, разница вызвана разницей в длине имени. если вы называете класс "averylongclassnamefornoapparentreason", его создание займет намного больше времени. так что пойди разберись.
Мудрец
27
Хм ... преждевременная оптимизация. Я бы предпочел находить сложные запросы SQL или другие узкие места в сети, если я действительно обеспокоен скоростью, а не трачу время на экономию 600 микросекунд. На самом деле, я бы предпочел сначала проверить, находится ли javascript в нижнем колонтитуле, а не в голове, чем заботиться, если один из них на 600 мкс быстрее другого.
Арди Арам
6
1000 слишком мало для надежного теста. Попробуйте миллиард.
правее
1
В мире PHP почти всегда лучше использовать массивы.
Вахид Амири
^ Определенно не так. Массив ада - это кошмар при работе в команде над большим проектом.
Дэви Дейв
6

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

будет эхом

Джон Доу

DevWL
источник
5

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

$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/ для получения более подробной информации.

Ниладри Банерджи - Уттарпара
источник
4

Пожалуйста, имейте в виду, что 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 >
Якуб Врона
источник
Потому что это НЕ один и тот же экземпляр, поэтому он не может сравняться друг с другом. Строгое сравнение работы классов с идентификацией экземпляра. Каждый экземпляр любого класса имеет уникальный идентификатор.
Бедник
3

Руководство 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 ничего не делает.

Даниел
источник
3

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

Пример :

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

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

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

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

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

Насир Насралла
источник
2

Вы также можете использовать 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];

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

Вахид Амири
источник
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

Причина, по которой у нас есть 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
supersan
источник