Вопрос
Пожалуйста, определите, что stdClass
есть.
Решение
stdClass
является ли общий пустой класс PHP, что-то вроде Object
на Java или object
в Python (Редактировать: но на самом деле не используется как универсальный базовый класс;Спасибо @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;
теперь подумайте, что у вас есть другой класс, который будет инициализироваться объектом page и выполняться на его основе.
<?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()
также хорошо.
Используя Стандартный класс вы можете создать новый объект с его собственными свойствами.Рассмотрим следующий пример, который представляет сведения о пользователе в виде ассоциативного массива.
$array_user = array();
$array_user["name"] = "smith john";
$array_user["username"] = "smith";
$array_user["id"] = "1002";
$array_user["email"] = "smith@nomail.com";
Если вам нужно представить те же сведения, что и свойства объекта, вы можете использовать Стандартный класс как показано ниже.
$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';
выдает объект стандартного класса - автоматическое приведение
Я узнал об этом сегодня из-за орфографической ошибки:
$GLOBASLS['myObj']->myPropertyObj->myProperty = 'myVal';
Круто!
stdClass - это не анонимный класс или анонимный объект
Ответы здесь включают выражения, которые stdClass
является анонимным классом или даже анонимным объектом.Это неправда.
stdClass
это просто обычный предопределенный класс.Вы можете проверить это с помощью instanceof
оператор или функция get_class
.Здесь нет ничего особенного.PHP использует этот класс при приведении других значений к объекту.
Во многих случаях , когда stdClass
используемый программистами массив является лучшим вариантом из-за полезных функций и того факта, что этот usecase представляет структуру данных, а не реальный объект.
На самом деле я попытался создать пустой стандартный класс и сравнил скорость с пустым классом.
class emp{}
затем приступили к созданию 1000 стандартных классов и emp...пустые классы были выполнены примерно за 1100 микросекунд, в то время как стандартные классы заняли более 1700 микросекунд.Поэтому я думаю, что лучше создать свой собственный фиктивный класс для хранения данных, если вы так сильно хотите использовать объекты для этого (массивы намного быстрее как для записи, так и для чтения).
Используемые объекты стандартного класса
Стандартный класс позволяет создавать анонимные классы. с помощью приведения объектов вы также можете получить доступ к ключам ассоциативного массива в стиле ООП.Точно так же, как вы получили бы доступ к обычному свойству объекта.
Пример
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"]);
будет отдаваться эхом
Джон Доу
Также стоит отметить, что при использовании приведения вам на самом деле не нужно создавать объект, как в ответе, данном @Bandula.Вместо этого вы можете просто преобразовать свой массив в объект, и будет возвращен stdClass.Например:
$array = array(
'Property1'=>'hello',
'Property2'=>'world',
'Property3'=>'again',
);
$obj = (object) $array;
echo $obj->Property3;
Output: again
Если вы хотите быстро создать новый объект для хранения некоторых данных о книге.Вы бы сделали что-то вроде этого:
$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/ для получения более подробной информации.
Пожалуйста, имейте в виду, что 2 пустых стандартных класса не являются строго равными.Это очень важно при написании ожиданий от издевательств.
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 >
php.net в руководстве есть несколько убедительных объяснений и примеров, предоставленных пользователями того, что такое stdClass, мне особенно нравится этот http://php.net/manual/en/language.oop5.basic.php#92123, https://stackoverflow.com/a/1434375/2352773.
stdClass - это объект PHP по умолчанию.У stdClass нет свойств, методов или родительского элемента.Он не поддерживает магические методы и не реализует никаких интерфейсов.
Когда вы приводите скаляр или массив в качестве объекта, вы получаете экземпляр stdClass .Вы можете использовать stdClass всякий раз, когда вам нужен универсальный объект экземпляр.
stdClass - это НЕ базовый класс!Классы PHP не наследуются автоматически ни от одного класса.Все классы являются автономными, если они явно расширить другой класс.PHP отличается от многих объектно-ориентированных языков в этом отношении.
Вы могли бы определить класс, расширяющий stdClass, но вы не получили бы никакой выгоды, поскольку stdClass ничего не делает.
стандартный класс это способ, с помощью которого php избегайте остановки интерпретации скрипта, когда необходимо поместить некоторые данные в класс, но к сожалению, этот класс не был определен
Пример :
return $statement->fetchAll(PDO::FETCH_CLASS , 'Tasks');
Здесь данные будут помещены в предопределенные "Задачи".Но, если бы мы сделали код следующим образом :
return $statement->fetchAll(PDO::FETCH_CLASS );
затем php поместит результаты в стандартный класс .
просто php говорит , что :смотрите, у нас здесь хорошие ДЕТИ [Возражает] , но без родителей .Итак , мы отправим их в Дом престарелых стандартный класс :)
Вы также можете использовать 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];
Второй метод в основном полезен для инициализации объектов со многими свойствами.
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';
что заставляет кого-то задуматься об использовании стиля объекта вместо стиля массива???