Будь ласка, визначте, що stdClass
таке.
Будь ласка, визначте, що 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 для отримання додаткових прикладів.
{}
конструкції 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 з об’єктом сторінки.
Тут не потрібно писати новий шаблон шаблону для цього, ви можете просто використовувати 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 дозволяє створювати анонімні класи та за допомогою кастингу об'єктів ви також можете отримувати доступ до ключів асоціативного масиву в стилі OOP. Так само, як ви отримаєте доступ до звичайної властивості об'єкта.
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