Определите, пожалуйста, что такое stdClass
.
Что такое stdClass в PHP?
Ответы (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.
{}
в JavaScript.
- person Earth Engine; 18.04.2013
function(StdClass $a, array $params)
v.s. проверка, является ли $a
объектом и instanceof
.
- person Dejan Marjanović; 16.04.2014
stdClass
- это просто общий «пустой» класс, который используется при преобразовании других типов в объекты. Несмотря на то, что говорится в двух других ответах, stdClass
не базовый класс для объектов в PHP. Это можно довольно легко продемонстрировать:
class Foo{}
$foo = new Foo();
echo ($foo instanceof stdClass)?'Y':'N';
// outputs 'N'
Я не верю, что в PHP есть концепция базового объекта
Object
в Java и stdClass
в PHP, являются динамические свойства. Вам не разрешено просто определять динамические свойства (или переменные) в объекте Java Object
, однако вам разрешено делать это в объекте stdClass
в PHP.
- person Miro Markaravanes; 29.10.2014
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();
stdClass
.
- person IMSoP; 26.03.2018
Также стоит отметить, что объект stdClass
также может быть создан с использованием json_decode()
.
True
. Логические значения - это нижний регистр true
или false
.
- person BadHorsie; 19.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 для дальнейшего понимания.
Так же,
$myNewObj->setNewVar = 'newVal';
дает объект stdClass - автоматически приведенный
Я узнал об этом сегодня, написав с ошибкой:
$GLOBASLS['myObj']->myPropertyObj->myProperty = 'myVal';
Прохладный!
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 и сравнил скорость с пустым классом.
class emp{}
затем приступил к созданию 1000 stdClasses и emps ... пустые классы были выполнены примерно за 1100 микросекунд, в то время как stdClasses заняли более 1700 микросекунд. Поэтому я думаю, что лучше создать собственный фиктивный класс для хранения данных, если вы так сильно хотите использовать для этого объекты (массивы намного быстрее как для записи, так и для чтения).
используемые объекты 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"]);
будет эхом
Джон Доу
Если вы хотите быстро создать новый объект для хранения данных о книге. Вы бы сделали что-то вроде этого:
$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/ для получения дополнительных сведений.
В руководстве по 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 ничего не делает.
stdclass - это способ, которым php избегайте остановки интерпретации скрипта, когда необходимо ввести некоторые данные класс, но, к сожалению, этот класс не был определен
Пример :
return $statement->fetchAll(PDO::FETCH_CLASS , 'Tasks');
Здесь данные будут помещены в заранее определенные «Задачи». Но если бы мы сделали такой код:
return $statement->fetchAll(PDO::FETCH_CLASS );
тогда php поместит результаты в stdclass.
просто php говорит, что: послушайте, у нас есть хороший ДЕТИ [Объекты] Здесь, но без родителей. Итак, мы отправим их в детский сад stdclass :)
Имейте в виду, что 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 >
Причина, по которой у нас есть 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
Вы также можете использовать 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];
Второй метод в основном полезен для инициализации объектов со многими свойствами.
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';
что заставляет задуматься об использовании стиля объекта вместо стиля массива ???