SlideShare a Scribd company logo
1 of 39
Download to read offline
Mastering SPL
Евгений Дорош
Кто нибудь использовал SPL*
без головной боли?
[* The Standard PHP Library (SPL) is a collection of interfaces
and classes that are meant to solve common problems]
Задача
Рассылать покупателям информацию о товарах из личного
списка желаний, сгруппировав их по событиям
Следим за событиями
Цена на товар упала (скидка)
Товар заканчивается на складе
Товар снова поступил на склад
? в будущем …
Листинг кода: одно событие
Коллекции
Итерация
Фильтрация
Листинг кода: два события [legacy code]
Минусы:
Тестируемость
Сопровождение
Повторное
использование
Не хочу видеть как
работает программа,
хочу понять что она
делает!
Заказчик: «А давайте добавим синхронизацию
значений цены, наличия товара на складе между
товаром из списка желаний и товаром из каталога
в процессе работы скрипта?»
«и еще ограничим количество найденных товаров
до 20 штук (n) за одно событие. В каждом новом
письме покажем следующие 20 - n товаров и т.д.»
Демонстрация SPL
Итераторы
Iterator
FilterIterator (chains)
Преимущества
Повторное использование

можем пользоваться
итератором в любом месте
Тестируемость

итераторы можно
протестировать отдельно
Функциональность

нет необходимости подгонять
бизнес логику

Документация
SPL - это то, что
упростит решение
нашей задачи!
Абстракция алгоритмов для
фокусировки на бизнес-логике
Итераторы в SPL
AppendIterator
ArrayIterator
CachingIterator
CallbackFilterIterator
DirectoryIterator
EmptyIterator
FilesystemIterator
FilterIterator
GlobIterator
InfiniteIterator
IteratorIterator
LimitIterator
MultipleIterator
NoRewindIterator
ParentIterator
RecursiveArrayIterator
RecursiveCachingIterator
RecursiveCallbackFilterIterator
RecursiveDirectoryIterator
RecursiveFilterIterator
RecursiveIteratorIterator
RecursiveRegexIterator
RecursiveTreeIterator
RegexIterator
Интерфейсы SPL
Countable
OuterIterator
RecursiveIterator
SeekableIterator
Документация: описание итератора
Крайне мало информации
Нет ясных примеров
Что? И это все что есть по SPL?!
Единственная
нормальная
книга по SPL
Платная 19$
Издана в июле 2013
PHP 5.4
Обращает внимание на
производительности кода
Понятные примеры
https://www.phparch.com/books/mastering-the-spl-library/
Структуры данных
Итераторы
Интерфейсы
Исключения
Разный фунционал
Содержание
Листинг кода: два события [legacy code]
Используем IteratorAggregate (Traversable)
Рефакторинг: фильтр продуктов
Используем FilterIterator
Используем LimitIterator
Пример фильтра BackInStock
Пример Customer_NonEmptyCollection
Не итератор, но
ЗНАЕТ о нем
Вырезки из книги по итераторам
https://github.com/php/php-src/tree/master/ext/spl/internal
Интерфейс Iterator
Интерфейс Traversable
Traversable не может быть реализован*
Traversable может быть определен
(instanceof)
foreach() автоматически обнаруживает
traversable и делает магию
Итераторы это весело!
Но местами неожиданно …
Проблема с FilterIterator
FilterIterator обращается к
current() элементу внешнего
итератора, чтоб выяснить
подходит ли он под фильтр
или нет. Это может быть
проблемой при изменении
состояния внешнего
итератора при вызове
current()
ArrayIterator
ArrayIterator самый популярный.
Данные хранятся только во внутреннем массиве в
противовес загрузке из внешнего источника
Не обходит массив рекурсивно. Нужен
RecursiveArrayIterator
Реализовано стандартное поведение count() и []
Предоставляет набор алгоритмов сортировки (uasort(),
natcasesort(), asort())
AppendIterator
CachingIterator
Читает следующее значение «в память» до того, как оно
понадобится для доступа
Кэширует все значения, которые возвращает
Хитрая система приведения объекта в строчку
CachingIterator странный итератор. Включает в
себя 3 вида функциональности:
CachingIterator
Спасибо за внимание!
Использованы фотографии Евгения Дороша, Игоря Панфиленко, 

Ирины Нищеретовой

More Related Content

Similar to Mastering PHP SPL (ru)

Php spl and design patterns
Php spl and design patternsPhp spl and design patterns
Php spl and design patternsPavel Usachev
 
Dependency injection
Dependency injectionDependency injection
Dependency injectionGetDev.NET
 
"Swift. Функциональное программирование", Игорь Литвиненко, DataArt
"Swift. Функциональное программирование", Игорь Литвиненко, DataArt"Swift. Функциональное программирование", Игорь Литвиненко, DataArt
"Swift. Функциональное программирование", Игорь Литвиненко, DataArtDataArt
 
Нагрузочное тестирование с помощью locust.io
Нагрузочное тестирование с помощью locust.ioНагрузочное тестирование с помощью locust.io
Нагрузочное тестирование с помощью locust.ioGrigory Petrov
 
Теория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямТеория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямSergey Staroletov
 
Функциональный .NET
Функциональный .NETФункциональный .NET
Функциональный .NETRoman Nevolin
 
урок 3 6 класс
урок 3 6 классурок 3 6 класс
урок 3 6 классmrsvetlana01
 
анализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияанализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияRuslan Shevchenko
 
REPL в Node.js: улучшаем быт разработчик
REPL в Node.js: улучшаем быт разработчикREPL в Node.js: улучшаем быт разработчик
REPL в Node.js: улучшаем быт разработчикIT61
 
ук 03.003.01 2011
ук 03.003.01 2011ук 03.003.01 2011
ук 03.003.01 2011etyumentcev
 
Ф'Yii'лософия
Ф'Yii'лософияФ'Yii'лософия
Ф'Yii'лософияPaul Klimov
 
Что нового в Visual Studio 2010 и .Net 4.0
Что нового в Visual Studio 2010 и .Net 4.0Что нового в Visual Studio 2010 и .Net 4.0
Что нового в Visual Studio 2010 и .Net 4.0akrakovetsky
 
C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.Igor Shkulipa
 
Ігор Карпиленко — PHPStorm for drupal developer
Ігор Карпиленко — PHPStorm for drupal developerІгор Карпиленко — PHPStorm for drupal developer
Ігор Карпиленко — PHPStorm for drupal developerLEDC 2016
 
По ту сторону ООП: PEAK-Rules и PyProtocols
По ту сторону ООП: PEAK-Rules и PyProtocolsПо ту сторону ООП: PEAK-Rules и PyProtocols
По ту сторону ООП: PEAK-Rules и PyProtocolsSergey Schetinin
 
Kozhemyakin dcm2011 1
Kozhemyakin dcm2011 1Kozhemyakin dcm2011 1
Kozhemyakin dcm2011 1drupalconf
 

Similar to Mastering PHP SPL (ru) (20)

Php spl and design patterns
Php spl and design patternsPhp spl and design patterns
Php spl and design patterns
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
 
DESIGN PATTERNS? EASY!
DESIGN PATTERNS? EASY!DESIGN PATTERNS? EASY!
DESIGN PATTERNS? EASY!
 
"Swift. Функциональное программирование", Игорь Литвиненко, DataArt
"Swift. Функциональное программирование", Игорь Литвиненко, DataArt"Swift. Функциональное программирование", Игорь Литвиненко, DataArt
"Swift. Функциональное программирование", Игорь Литвиненко, DataArt
 
Нагрузочное тестирование с помощью locust.io
Нагрузочное тестирование с помощью locust.ioНагрузочное тестирование с помощью locust.io
Нагрузочное тестирование с помощью locust.io
 
DLR Hosting
DLR HostingDLR Hosting
DLR Hosting
 
Теория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямТеория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциям
 
Функциональный .NET
Функциональный .NETФункциональный .NET
Функциональный .NET
 
урок 3 6 класс
урок 3 6 классурок 3 6 класс
урок 3 6 класс
 
анализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияанализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестирования
 
REPL в Node.js: улучшаем быт разработчик
REPL в Node.js: улучшаем быт разработчикREPL в Node.js: улучшаем быт разработчик
REPL в Node.js: улучшаем быт разработчик
 
ук 03.003.01 2011
ук 03.003.01 2011ук 03.003.01 2011
ук 03.003.01 2011
 
Genome
GenomeGenome
Genome
 
Ф'Yii'лософия
Ф'Yii'лософияФ'Yii'лософия
Ф'Yii'лософия
 
Что нового в Visual Studio 2010 и .Net 4.0
Что нового в Visual Studio 2010 и .Net 4.0Что нового в Visual Studio 2010 и .Net 4.0
Что нового в Visual Studio 2010 и .Net 4.0
 
C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.
 
Deep storm presentation
Deep storm presentationDeep storm presentation
Deep storm presentation
 
Ігор Карпиленко — PHPStorm for drupal developer
Ігор Карпиленко — PHPStorm for drupal developerІгор Карпиленко — PHPStorm for drupal developer
Ігор Карпиленко — PHPStorm for drupal developer
 
По ту сторону ООП: PEAK-Rules и PyProtocols
По ту сторону ООП: PEAK-Rules и PyProtocolsПо ту сторону ООП: PEAK-Rules и PyProtocols
По ту сторону ООП: PEAK-Rules и PyProtocols
 
Kozhemyakin dcm2011 1
Kozhemyakin dcm2011 1Kozhemyakin dcm2011 1
Kozhemyakin dcm2011 1
 

Mastering PHP SPL (ru)