SPL

Стандартная библиотека PHP (SPL) - это набор интерфейсов и классов, предназначенных для решения стандартных задач.

Не требуется никаких внешних библиотек для сборки этого расширения, и оно доступно по умолчанию в PHP 5.0.0 и выше.

SPL предоставляет ряд стандартных структур данных, итераторов для оббегания объектов, интерфейсов, стандартных исключений, некоторое количество классов для работы с файлами и предоставляет ряд функций, например spl_autoload_register().

Итераторы

  • array-доступ к объектам
  • простая итерация
  • итерация с поиском
  • рекурсивная итераци
  • итерация с фильтрацией

Доступ к объектам как к массивам

interface ArrayAccess
{
    function offsetSet($offset, $value);
    function offsetGet($offset);
    function offsetUnset($offset);
    function offsetExists($offset);
}

Интерфейс предоставляет лишь базовые методы для итерации массива: синтаксис массивов для установки, удаления, добавления. Но не больше.

Замечание: реализация интерфейса ArrayAccess не позволяет использовать объект как массив с нативными функциями, такими как array_*(). Например, array_key_exists всегда вернет FALSE.

PHP предоставляет конкретную реализацию этого интерфейса в классе ArrayObject.

$obj = new ArrayObject($array);

Замечание: наследование от класса ArrayObject не позволяет использовать объект в таких функциях как array_values() и других, для работы с массивами. При передаче такого объекта в функцию будет сгенерирован Warning:

$obj = new ArrayObject();
$res = array_values($obj);

// Warning: array_values() expects parameter 1 to be array, object given

Итераторы позволяют программно обходить структуры данных, позволяя применять конструкцию foreach ($array as $key => $value) над любым набором данных, независимо от их структуры.

Есть два вида итераторов: inner iterators и outer iterators. Inner iterators (внутренние итераторы) используются для итерации над данными и реализуют Iterator или IteratorAggregate интерфейсы, в то время как outer iterators (внешние итераторы) используются для итерации над другими итераторами и реализуют OuterIterator интерфейс.

Интерфейс Traversable

Интерфейс, определяющий, является ли класс обходимым (traversable) используя foreach.

Замечание: Это внутренний интерфейс, который не может быть реализован в скрипте PHP. Вместо него нужно использовать либо IteratorAggregate, либо Iterator. При реализации интерфейса, наследующего от Traversable, убедитесь, что в секции implements перед его именем стоит IteratorAggregate или Iterator.

Интерфейс Iterator

Интерфейс для внешних итераторов или объектов, которые могут повторять себя изнутри.

Структуры данных

SPL предоставляет набор стандартных структур данных. Они сгруппированы здесь по своей базовой реализации, которая обычно определяет их общую область применения.

Двусвязные списки

Двусвязный список (DLL) - это список узлов, связанных в обоих направлениях друг между другом. Операции итератора, доступ к обоим концам, добавление или удаление узлов стоимостью O(1), когда основная структура является DLL. Следовательно, он обеспечивает хорошую реализацию для стеков и очередей.

  • SplDoublyLinkedList
    • SplStack
    • SplQueue

Кучи

Кучи являются древовидными структурами, что следует из свойства кучи: каждый узел больше или равен своим потомкам, при этом для сравнения используется внедренный метод сравнения, который является общим для всей кучи.

  • SplHeap
    • SplMaxHeap
    • SplMinHeap
  • SplPriorityQueue

Массивы

Массивы - структуры, которые хранят данные в непрерывном виде, доступные через индексы. Не путайте их с массивами PHP: последние на самом деле реализованы в виде упорядоченных хэш-таблиц.

  • SplFixedArray

Карта

Карта - это структура данных, содержащая пары ключ-значение. Массивы PHP можно рассматривать как карты, отображающие целые/строковые данные в их значения. SPL предоставляет карту, отображающую объекты к данным. Эта карта также может быть использована как множество объектов.

  • SplObjectStorage
Структура Описание
SplDoublyLinkedList обеспечивает основные функциональные возможности двусвязного списка
SplStack предоставляет основные функциональные возможности стека, реализованные с использованием двусвязного списка
SplQueue предоставляет основные функциональные возможности очереди, реализованные с использованием двусвязного списка
SplMaxHeap предоставляет основные функциональные возможности кучи, сохраняя максимальный элемент наверху
SplMinHeap предоставляет основные функциональные возможности кучи, сохраняя минимальный элемент наверху
SplPriorityQueue обеспечивает основные функциональные возможности приоритетной очереди, реализованный при помощи кучи (max-heap)
SplFixedArray обеспечивает базовую функциональность, предоставляемый массивами. Главное различие между SplFixedArray и обычным массивом PHP в том, что SplFixedArray имеет фиксированную длину, а в качестве индексов могут выступать только целочисленные значения. Преимущество данных ограничений заключается в более быстрой обработке массива
SplObjectStorage предоставляет соответствие объекты-данные или набор объектов, игнорируя данные. Эта двойная цель может быть полезна во многих случаях, включая необходимость уникальной идентификации объектов. Для создания хэша объекта используется функция spl_object_hash().