Что такое stdClass в PHP?
Пожалуйста, определите, что stdClass
является.
18 ответов
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 для большего количества примеров.
stdClass
это просто универсальный "пустой" класс, который используется при приведении других типов к объектам. Несмотря на то, что говорят два других ответа, stdClass
не является базовым классом для объектов в PHP. Это может быть продемонстрировано довольно легко:
class Foo{}
$foo = new Foo();
echo ($foo instanceof stdClass)?'Y':'N';
// outputs 'N'
Я не верю, что есть концепция базового объекта в PHP
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.
Здесь нет необходимости писать новый шаблон класса, для этого вы можете просто использовать stdClass для создания класса на лету.
$pageview=new PageShow($page);
$pageview->show();
Также стоит отметить, что stdClass
объект может быть создан с использованием json_decode()
также.
Используя 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 для дальнейшего понимания.
Точно так же,
$myNewObj->setNewVar = 'newVal';
возвращает объект stdClass - автоматически приведен
Я узнал об этом сегодня по орфографии:
$GLOBASLS['myObj']->myPropertyObj->myProperty = 'myVal';
Здорово!
Причина, по которой у нас есть 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
stdClass не является анонимным классом или анонимным объектом
Ответы здесь включают выражения, которые stdClass
является анонимным классом или даже анонимным объектом. Это не правда.
stdClass
это просто предопределенный класс. Вы можете проверить это используя instanceof
оператор или функция get_class
, Ничего особенного здесь не происходит. PHP использует этот класс при приведении других значений к объекту.
Во многих случаях, когда stdClass
используется программистами, массив является лучшим вариантом, из-за полезных функций и того факта, что этот сценарий использования представляет структуру данных, а не реальный объект.
Также стоит отметить, что при использовании Casting вам на самом деле не нужно создавать объект, как в ответе @Bandula. Вместо этого вы можете просто привести ваш массив к объекту и вернуть stdClass. Например:
$array = array(
'Property1'=>'hello',
'Property2'=>'world',
'Property3'=>'again',
);
$obj = (object) $array;
echo $obj->Property3;
Output: again
Используемые объекты 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"]);
будет эхом
Джон Доу
На самом деле я попытался создать пустой stdClass и сравнил скорость с пустым классом.
class emp{}
затем приступили к созданию 1000 stdClasses и emps... пустые классы были созданы примерно за 1100 микросекунд, в то время как stdClasses заняло более 1700 микросекунд. Поэтому я думаю, что лучше создать свой собственный фиктивный класс для хранения данных, если вы хотите использовать объекты для этого так плохо (массивы намного быстрее как для записи, так и для чтения).
В руководстве по php.net есть несколько убедительных объяснений и примеров, представленных пользователями о том, что такое stdClass, мне особенно нравится этот http://php.net/manual/en/language.oop5.basic.php, /questions/38356348/kak-opredelit-pustoj-obekt-v-php/38356357#38356357.
stdClass - это объект PHP по умолчанию. У stdClass нет свойств, методов или родительского элемента. Он не поддерживает магические методы и не реализует интерфейсы.
Когда вы приводите скаляр или массив как Object, вы получаете экземпляр stdClass. Вы можете использовать stdClass всякий раз, когда вам нужен экземпляр общего объекта.
stdClass не является базовым классом! Классы PHP не наследуются автоматически ни от одного класса. Все классы автономны, если они явно не расширяют другой класс. В этом отношении PHP отличается от многих объектно-ориентированных языков.
Вы можете определить класс, который расширяет stdClass, но вы не получите никакой выгоды, так как stdClass ничего не делает.
stdclass - это способ, которым php избегает остановки интерпретации скрипта, когда в классе должны быть какие-то данные, но, к сожалению, этот класс не был определен
Пример:
return $statement->fetchAll(PDO::FETCH_CLASS , 'Tasks');
Здесь данные будут помещены в предопределенные "Задачи". Но, если бы мы сделали код так:
return $statement->fetchAll(PDO::FETCH_CLASS );
тогда php поместит результаты в стандартный класс.
просто php говорит, что: смотри, у нас есть хорошие дети [объекты] здесь, но без родителей. Итак, мы отправим их в детский дом по уходу за детьми stdclass:)
Пожалуйста, помните, что 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 >
Если вы хотите быстро создать новый объект для хранения некоторых данных о книге. Вы бы сделали что-то вроде этого:
$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.stackru.com/amzn/click/0439136369";
Пожалуйста, проверьте сайт - http://www.webmaster-source.com/2009/08/20/php-stdclass-storing-data-object-instead-array/ для получения более подробной информации.
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';
что заставляет кого-то задуматься об использовании стиля объекта вместо стиля массива???
Вы также можете использовать 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];
Второй метод в основном полезен для инициализации объектов со многими свойствами.
stdClass
в PHP это классический универсальный класс. Он не имеет встроенных свойств или методов. По сути, он используется для приведения типов, создания объектов с динамическими свойствами и т. д. Если у вас есть фон javascript, вы можете определить как
$o = new \stdClass();
эквивалентно
const o = {};
Он создает пустой объект, позже заполняемый потоком управления программы.