Що таке stdClass в PHP?


Відповіді:


785

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 для отримання додаткових прикладів.


7
можливо, він використав mysql_fetch_object. що створює примірник stdlcass, якщо я не помиляюся.
Галена

69
Це не зовсім базовий клас у тому, яким є об’єкт Java, дивіться мою відповідь нижче.
Ciaran McNulty

1
Я сподіваюся, що ви знаєте, що об'єкт не є похідним класом "всіх" об'єктів в Python ... Принаймні, не до тих пір, поки вас не змусять виводити з об'єкта в Python 3.0
монокроме

11
Я думаю, що люди повинні сказати, що stdClass - це щось на зразок {}конструкції JavaScript .
Земляний двигун

Сер, ваша відповідь частково неправильна, оскільки стаття невірна. Єдина (і це теж неправильно), що дає вам розширення цього класу - це можливість ввести підказку, тобто function(StdClass $a, array $params)проти перевірки, чи $aє об'єктом і instanceof.
Деян Марянович

1114

stdClass- це просто загальний клас "порожній", який використовується під час передавання інших типів об'єктам. Незважаючи на те, що кажуть два інші відповіді, stdClassце не базовий клас для об'єктів у PHP. Це можна продемонструвати досить легко:

class Foo{}
$foo = new Foo();
echo ($foo instanceof stdClass)?'Y':'N';
// outputs 'N'

Я не вірю, що в PHP існує концепція базового об'єкта


4
що означає std?
Адам Уайт

47
std = стандарт -
Томаш Прадо

1
Це корисний клас! До речі, це справжній коментар!
Густав

16
Власне, перше речення після фрагмента коду відповідає на питання.
MauganRa

2
@Miro Markaravanes: Динамічні атрибути можна призначити будь-якому класу в PHP, а не тільки stdClass.
СТАН

95

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();

3
порожній клас з корисними функціями, які працюють з рядками, також його кращий стандарт кодування
borrel

1
Це було б так само, як використання масиву. Насправді STDclass генерується під час типу жонглювання, як масив для перетворення об’єкта.
varuog

1
Будь ласка, виправте друк у своєму коді: ($ this-> currentpage-> name == 1) має бути ($ this-> currentpage-> status == 1)
Enriqe

7
"Ви можете створити анонімний клас PHP" - Це не анонімний клас . Ви можете використовувати instanceof, get_class, ...
Джон Сміт

2
Ця відповідь особливо бентежить, що PHP насправді має анонімні класи , які сильно відрізняються від stdClass.
IMSoP

59

Також варто зазначити, що stdClassоб’єкт може бути створений і з використанням json_decode().


5
Правда. Я часто використовую json_encode та json_decode для перетворення масиву в об’єкт до масиву, коли це необхідно.
pinkal vansia

6
$ x = json_decode (json_encode ($ object), True) буде декодувати об’єкт у масив, але це не є бінарним безпечним. По суті, якщо він не є простим текстом, він може зламатися в JSON.
simontemplar

@simontemplar У PHP не слід писати True. Булеві букви малі trueабо false.
BadHorsie

2
@simontemplar Посібник не робить, але PSR-2 це робить, тому якщо ви дотримуєтесь будь-яких стандартів, це повинно бути в малих регістрах. Звичайно, якщо ви хочете написати це так, що це дійсно, але ви повинні дотримуватися стандартів. Документація вручну для булевих буде надзвичайно стара, ймовірно, написана до того, як будуть сформовані стандарти. Будемо чесними, PHP спочатку був написаний як повний безлад без будь-яких стандартів (див. Широкий спектр використовуваних конвенцій про іменування змінних / функцій / об'єктів). Я чесно ніколи не бачив жодного PHP-коду, де розробник використовував ваш формат.
BadHorsie

2
Я дотримуюся PSR-2, за винятком True / False / Null і ставлячи брекети, що відкриваються, на власні лінії для занять. Крім цього, мені просто все одно. Однак якщо я колись редагую чужий код, я дотримуюся будь-якого стандарту, який вони використовують (якщо такий є, як правило, немає), і якщо я цього не роблю, виконую PSR-2 "правильним" способом. Там багато богового жахливого коду з безліччю інших проблем, що велика капіталізація трьох ключових слів - це найменша моя турбота.
simontemplar

26

Використовуючи 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 для подальшого розуміння.


24

Так само,

$myNewObj->setNewVar = 'newVal'; 

дає об’єкт stdClass - автоматичне відтворення

Я дізнався це сьогодні, неправильно написавши:

$GLOBASLS['myObj']->myPropertyObj->myProperty = 'myVal';

Класно!


9
Але це повинно підняти E_NOTICE
Petah

3
@Petah Тільки в PHP 5.3+, хоча правда? Але так, це точно погана практика.
ChristoKiwi

15

stdClass не є анонімним класом або анонімним об'єктом

Відповіді тут включають вирази, які stdClassє анонімним класом або навіть анонімним об’єктом. Це не правда.

stdClassце лише звичайний заздалегідь визначений клас. Ви можете перевірити це за допомогою instanceofоператора або функції get_class. Тут нічого особливого не йде. PHP використовує цей клас при передачі інших значень для об'єкта.

У багатьох випадках, коли stdClassвикористовується програмістами, масив є кращим варіантом, оскільки корисні функції та той факт, що цей шаблон використання представляє структуру даних, а не реальний об'єкт.


8

Варто також зазначити, що використовуючи Casting, вам насправді не потрібно створювати об'єкт, як у відповіді, наданій @Bandula. Натомість ви можете просто кинути масив об’єкту, і stdClass повернеться. Наприклад:

$array = array(
    'Property1'=>'hello',
    'Property2'=>'world',
    'Property3'=>'again',
);

$obj = (object) $array;
echo $obj->Property3;

Output: again


Любіть це. Набагато чистіше!
WebSpanner

7

Насправді я спробував створити порожній stdClass і порівняв швидкість з порожнім класом.

class emp{}

потім продовжили створення 1000 stdClasses і emps ... порожні класи були виконані приблизно за 1100 мікросекунд, тоді як stdClasses займало понад 1700 мікросекунд. Тому я гадаю, що краще створити власний фіктивний клас для зберігання даних, якщо ви хочете використовувати об'єкти для цього так погано (масиви набагато швидше як для запису, так і для читання).


22
очевидно, різниця викликана різницею в довжині імені. якщо ви називаєте клас "averylongclassnamefornoapparentreason", його створення займе набагато більше часу. тому йдіть фігурою.
Мудрець

27
Хммм ... передчасна оптимізація. Я вважаю за краще знайти складні запити SQL або інші мережеві вузькі місця, якщо я дійсно переймаюся швидкістю, а не витрачаю час на економію 600 мікросекунд. Насправді, я б краще спершу перевірити, чи не JavaScript у нижньому колонтитулі, а не в голові, ніж дбати, якщо один на 600 мікросекунд швидший за інший.
Арді Арам

6
1000 занадто мало для надійного орієнтиру. Спробуйте мільярд.
праворуч

1
У світі PHP майже завжди краще використовувати масиви.
Вахід Амірі

^ Однозначно не так. Пекельний масив - це кошмар, коли працює в команді над великим проектом.
Даві Дейв

6

об'єкти stdClass, що використовуються

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"]);

буде відлунювати

Джон До


5

Якщо ви хочете швидко створити новий об’єкт, щоб зберегти деякі дані про книгу. Ви зробите щось подібне:

$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/ для отримання більш детальної інформації.


4

Будь ласка, майте на увазі, що 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 >

Оскільки це НЕ той самий примірник, ерго він не може дорівнювати один одному. Суворе порівняння роботи класів з ідентифікацією екземпляра. Кожен екземпляр будь-якого класу має унікальний ідентифікатор.
Беднік

3

У посібнику 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 нічого не робить.


3

це спосіб, яким уникати інтерпретації сценарію, коли є якісь дані, слід класти в клас, але, на жаль, цей клас не був визначений

Приклад:

 return $statement->fetchAll(PDO::FETCH_CLASS  , 'Tasks');

Тут дані будуть розміщені у попередньо визначених "Завданнях". Але, якби ми зробили код так:

 return $statement->fetchAll(PDO::FETCH_CLASS );

то поставить результати .

просто каже, що: дивіться, у нас хороші діти [Об'єкти] Тут, але без батьків. Тож ми відправлятимемо їх у будинок для догляду за немовлятами :)


2

Ви також можете використовувати 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];

Другий метод в основному корисний для ініціалізації об'єктів з багатьма властивостями.


1

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';

що змушує когось задуматися про використання об’єктного стилю замість стилю масиву ???


0

Причина, чому у нас є 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.