PHP поставляется с небольшим набором предопределённых классов, в который входит stdClass
. Этот класс имеет особое значение для языка и используется в некоторых ситуациях автоматически.
Первое, что бросается в глаза: stdClass
нарушает стандарт именования и начинается с маленькой буквы. Вторая особенность проявляется при работе с ним — в stdClass
нет предопределённых свойств и методов, но объекты этого класса могут наполняться любыми свойствами в процессе работы.
<?php
$obj = new stdClass();
$obj->key = 'value';
var_dump($obj);
// class stdClass#1 (1) {
// public $key =>
// string(5) "value"
// }
Для объектов обычных классов (не stdClass), попытка прочитать значение неопределенного свойства приводит к Notice, который является ошибкой. Однако, даже там можно имитировать поведение stdClass
. Делается это с помощью специальных магических методов __get()
и __set()
. Эти методы вызываются автоматически при обращении к неопределённым свойствам и позволяют создавать их на лету.
<?php
class MyStdClass
{
private $properties = [];
public function __set($name, $value)
{
$this->properties[$name] = $value;
}
public function __get($name)
{
return $this->properties[$name];
}
// Для полноты полезно реализовать метод __isset
// https://php.net/manual/ru/language.oop5.overloading.php#object.isset
}
$obj = new MyStdClass();
$obj->key = 'value'; // __set($name, $value) где $name = 'key', а $value = 'value'
$obj->key; // __get($name) где $name = 'key'
print_r($obj);
// MyStdClass Object
// (
// [properties:Tmp\MyStdClass:private] => Array
// (
// [key] => value
// )
//
// )
Такие объекты очень похожи на ассоциативные массивы, но с объектным синтаксисом. Например, в JavaScript встроен тип данных object
, который ведёт себя одновременно и как ассоциативный массив, и как объект из примера выше. В зависимости от желания, к нему можно обращаться и так, и так.
const obj = {};
obj.key = 'value';
obj.key; // value
obj['key']; // value
obj['key'] = 'value2';
obj.key; // value2
Преобразование типов
Преобразование ассоциативного массива в объект приводит к созданию объекта класса stdClass
;
<?php
$userAsArray = [
'name' => 'George',
'age' => 18
];
$userAsObject = (object) $userAsArray;
var_dump($userAsObject);
// class stdClass#2 (2) {
// public $name =>
// string(6) "George"
// public $age =>
// int(18)
// }
Парсинг JSON
В PHP не разделяются понятия массив и ассоциативный массив, что резко отличается от всех остальных языков и форматов. Например, в JSON это два разных типа данных.
{
"files": ["src/Countable.php", "src/Moment.php"],
"require": {
"phpunit": "*",
"http-client": "*"
}
}
В JSON files
содержит массив, а require
- ассоциативный массив. Именно в таких ситуациях и подходит stdClass
(хотя, откровенно говоря, это - костыль из-за отсутствия нормальных массивов). Функция json_decode()
парсит переданный ей JSON и формирует либо массив, либо объект stdClass
, в зависимости от того, чем были данные внутри JSON.
stdClass Object
(
[files] => Array
(
[0] => src/Countable.php
[1] => src/Moment.php
)
[require] => stdClass Object
(
[phpunit] => *
[http-client] => *
)
)
Конфигурация
Многие фреймворки используют stdClass
для хранения конфигурации, так как она динамическая (то есть состав ключей меняется в зависимости от потребностей разработчика).
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.