Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Класс stdClass PHP: Объектно-ориентированный дизайн

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 для хранения конфигурации, так как она динамическая (то есть состав ключей меняется в зависимости от потребностей разработчика).


Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
от 6 300 ₽ в месяц
Разработка веб-приложений на Laravel
10 месяцев
с нуля
Старт 2 мая

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»