SPL в PHP

В последнее время в нашем блоге часто упоминалось название SPL – сперва в постах, затем в комментариях. Сегодня я решил не ограничиваться простым упоминанием, а сделать небольшой обзор это библиотеки.

Начнем с определения: SPL (Standart PHP Library) – это коллекция интерфейсов и классов, предназначенных для решения стандартных задач.

Эта библиотека, устанавливается по-умолчанию для php > 5.0.0, а начиная с PHP 5.3.0 она будет доступна в любом случае (неотделима от пакета php).

Одним из удобств, предоставляемым этой библиотекой являются итераторы.
Для начала можно посмотреть как это выглядит в действии.

Работа с классом DirectoryIterator.

<?php
$it = new DirectoryIterator('./');
while($it->valid()) {
	echo $it->current()->getFileName().'<br />';
	$it->next();
}
?>

Этот скрипт выведет список всех файлов внутри текущего каталога. В этом примере я использовал класс DirectoryIterator из библиотеки SPL.

Следующий пример демонстрирует работу класса ArrayObject.

<?
$array = array('a', 'b', 'c', 'd', 'e', 'f', 'g');
$arrayObj = new ArrayObject($array);
$it = $arrayObj->getIterator();
while ($it->valid()) {
	echo $it->key() . ' => ' . $it->current() . '<br />';
	$it->next();
}
?>

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

Такой подход позволяет использовать очень много полезных вещей, которые можно легко реализовать через переопределение некоторых методов классов библиотеки Spl.

Для демонстрации этого рассмотрим следующий класс этой библиотеки FilterIterator. Предназначением этого класса является отсеивание ненужных элементов из коллекции на этапе ее обхода. Допустим, нам нужно выбрать только те элементы массива, у которых ключи являются целыми числами:

<?php
$letters = array('a', 'b', 'c', 'd', 'e', 'letter'=>'f', 'g');
class FltrIterator extends FilterIterator{
	public function __construct( Iterator $it ){
		parent::__construct( $it );
	}
	function accept(){
		return is_numeric($this->key());
	}
}
$filtered = new FltrIterator(new ArrayIterator($letters));
foreach($filtered as $k => $value) {
	echo $k.' -> '.$value.'<br />';
}
?>

Я думаю вышенаписанные примеры в достаточной мере Вас заинтересовали, поэтому оставлю такие классы как SimpleXMLIterator, Caching Iterator, Limit Iterator и SplFileObject на самостоятельное рассмотрение :) Хочу лишь заметить, что эти классы на практике можно использовать очень часто и они избавят вас от некоторой рутинной работы.

В php версии 5.3.0 эта библиотека была значительно расширена. В одной из следующих статей я постараюсь сделать обзор этих нововведений.

На этом у меня все. Удачи!





Читайте также:



2 Ответов на “SPL в PHP”

  1. Igor

    Хорошая вводная статья. Сам часто пользуюсь итератором для массива или директорий. Хотелось бы обзор нового в версии 5.3

  2. JustGuy

    Если честно, то не совсем понимаю смысл ArrayObject’а, наверное единственное применение - если у нас модели ооочень простенькие(обычне set/get методы + может парочка специфичных), тогда можно организовать хранение данных в таких моделях в объекте ArrayObject а доступ через __set() и __get() - кода получится очень мало…Это только предположение)
    Еще видел реализацию паттерна Registry с его помощью, но тоже не очень понятно, почему проще использовать
    $registry[‘dbHandler’];
    а не
    Registry::getInstance()->get(‘dbHandler’);
    Плюс насколько я понимаю, это всего лишь эмуляция массива и большинство (все?) функий по работе с массивами не будут работать…вообщем не понимаю)))


© Copyright. . I-Novice. All Rights Reserved. Terms | Site Map