Какой магический метод в PHP используется для доступа к объекту как к массиву?

«Какой магический метод в PHP используется для доступа к объекту как к массиву?» — вопрос из категории PHP Core, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Чтобы объект в PHP мог использоваться как массив (с синтаксисом $obj['key']), он должен реализовывать интерфейс ArrayAccess. Этот интерфейс требует определения четырех методов:

  1. offsetExists($offset): bool — проверяет, существует ли элемент по ключу.
  2. offsetGet($offset): mixed — возвращает значение по ключу.
  3. offsetSet($offset, $value): void — устанавливает значение по ключу.
  4. offsetUnset($offset): void — удаляет элемент по ключу.

Практический пример — коллекция:

class ItemCollection implements ArrayAccess
{
    private array $items = [];

    public function offsetExists($offset): bool
    {
        return array_key_exists($offset, $this->items);
    }

    public function offsetGet($offset): mixed
    {
        return $this->items[$offset] ?? null;
    }

    public function offsetSet($offset, $value): void
    {
        if (is_null($offset)) {
            $this->items[] = $value; // Добавление в конец, как $array[]
        } else {
            $this->items[$offset] = $value;
        }
    }

    public function offsetUnset($offset): void
    {
        unset($this->items[$offset]);
    }
}

// Использование
$cart = new ItemCollection();
$cart['apple'] = 5;      // Вызовет offsetSet
$count = $cart['apple']; // Вызовет offsetGet, вернет 5
isset($cart['pear']);    // Вызовет offsetExists, вернет false
unset($cart['apple']);   // Вызовет offsetUnset

Это мощный инструмент для создания объектов, которые ведут себя как нативные структуры данных.