SPL — это коллекция интерфейсов и классов, предоставляющих решения для распространенных задач. Это встроенное расширение PHP, доступное начиная с версии 5.0.
Наиболее полезная часть SPL — реализация различных паттернов итераторов.
Пример использования ArrayIterator:
$array = ['a', 'b', 'c'];
$iterator = new ArrayIterator($array);
foreach ($iterator as $value) {
echo $value . "\n";
}
Популярные итераторы:
RecursiveArrayIterator
- для многомерных массивовDirectoryIterator
- для работы с файловой системойFilterIterator
- базовый класс для фильтрацииLimitIterator
- постраничная навигацияSPL предлагает реализации классических структур данных:
$stack = new SplStack();
$stack->push('a');
$stack->push('b');
echo $stack->pop(); // 'b'
$queue = new SplQueue();
$queue->enqueue('a');
$queue->enqueue('b');
echo $queue->dequeue(); // 'a'
Доступные структуры:
SplStack
(LIFO)SplQueue
(FIFO)SplHeap
(куча)SplPriorityQueue
(очередь с приоритетом)SplFixedArray
(фиксированный массив с лучшей производительностью)Улучшенные инструменты для работы с файлами:
$dir = new RecursiveDirectoryIterator('/path');
$iterator = new RecursiveIteratorIterator($dir);
foreach ($iterator as $file) {
echo $file->getPathname() . "\n";
}
SPL предоставляет стандартизированный способ автозагрузки:
spl_autoload_register(function ($class) {
include 'classes/' . $class . '.class.php';
});
Объектное представление файла:
$file = new SplFileInfo('example.txt');
echo $file->getSize(); // размер файла
echo $file->getExtension(); // расширение
Хранилище объектов с уникальными идентификаторами:
$storage = new SplObjectStorage();
$obj1 = new stdClass();
$obj2 = new stdClass();
$storage->attach($obj1);
$storage->attach($obj2);
foreach ($storage as $object) {
var_dump($object);
}
Специализированные исключения:
try {
// код, который может выбросить исключение
} catch (RuntimeException $e) {
// обработка
} catch (LogicException $e) {
// другая обработка
}
class Subject implements SplSubject {
private $observers;
public function __construct() {
$this->observers = new SplObjectStorage();
}
public function attach(SplObserver $observer) {
$this->observers->attach($observer);
}
public function notify() {
foreach ($this->observers as $observer) {
$observer->update($this);
}
}
}
class OddFilter extends FilterIterator {
public function accept() {
return $this->current() % 2 != 0;
}
}
$numbers = new ArrayIterator([1, 2, 3, 4, 5]);
$filtered = new OddFilter($numbers);
foreach ($filtered as $number) {
echo $number . "\n"; // 1, 3, 5
}
$file = new SplFileObject('large.csv');
$file->setFlags(SplFileObject::READ_CSV);
foreach ($file as $row) {
print_r($row);
}
SPL — это мощный набор инструментов, который каждый профессиональный PHP-разработчик должен иметь в своем арсенале. Хотя некоторые компоненты могут показаться сложными на первый взгляд, их освоение окупается повышением качества, производительности и поддерживаемости кода.