Будь ласка, визначте, що stdClassтаке.
Будь ласка, визначте, що stdClassтаке.
Відповіді:
stdClass- це загальний порожній клас PHP, подібний Objectдо Java або objectPython ( Редагувати: але насправді не використовується як універсальний базовий клас; дякую @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