Пожалуйста, определите, что stdClass
есть.
Пожалуйста, определите, что stdClass
есть.
Ответы:
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 .
function(StdClass $a, array $params)
против проверки, $a
является ли объект и instanceof
.
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 Object.
Здесь нет необходимости писать новый шаблон класса, для этого вы можете просто использовать stdClass для создания класса на лету.
$pageview=new PageShow($page);
$pageview->show();
stdClass
.
Также стоит отметить, что stdClass
объект может быть создан с использованием json_decode()
также.
True
. Булевы строчные true
или false
.
Используя 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
являются анонимным классом или даже анонимным объектом. Это не правда.
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 позволяет создавать анонимные классы, а с помощью приведения объектов вы также можете получить доступ к ключам ассоциативного массива в стиле ООП. Так же, как вы бы получили доступ к обычному свойству объекта.
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/ для получения более подробной информации.
Пожалуйста, имейте в виду, что 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 >
Руководство 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 :)
Вы также можете использовать 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';
что заставляет кого-то задумываться об использовании стиля объекта вместо стиля массива ???
Причина, по которой у нас есть 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