Владимир Хворостянкин: Standard PHP Library. Зачем оно нам надо?
-
Upload
oleg-poludnenko -
Category
Technology
-
view
503 -
download
12
Transcript of Владимир Хворостянкин: Standard PHP Library. Зачем оно нам надо?
Основные проблемы:
1. Недостаточно документации
2. Нелогичность названий
3. Примеры если есть, то простейшие или
нерабочие
Interface
1. Traversable интерфейс, который невозможно реализовать
напрямую в нашем коде
2. Можно только определить, что объект реализует данный
интерфейс
3. Foreach определяет что объект Traversable и меняет логику
своей работы
1. Возможность изменять поведение обходных циклов
2. Отделение бизнес логики от логики фильтрации данных
Какой толк от итераторов?
Interface
1 => a
2 => b
3 => c
4 => d
5 => e
6 => f
7 => g
8 => h
9 => i
10 => j
11 => k
12 => l
13 => m
14 => n
15 => o
16 => p
17 => q
18 => r
19 => s
20 => t
21 => u
22 => v
23 => w
24 => x
25 => y
26 => z
Interface
• Не все сущности являются
итерируемыми, параметры
объекта могут содержать в
себе итераторы, так и
произвольные типы
данных
• Код слишком «загружен»
реализацией итератора
Interface
IteratorAggregate
IteratorAggregate используется для объектов, которые должны итерироваться, но итерируемыми сами не являются
Interface
Interface
1. Необходимо реализовать метод seek()
2. Ускоряет работу других итераторов за счет прямого перехода
на искомый элемент
3. Это идеальный вариант для массивов с чтением произвольных
элементов
• AppendIterator
• ArrayIterator
• CachingIterator
• CallbackFilterIterator
• DirectoryIterator
• EmptyIterator
• FilesystemIterator
• FilterIterator
• GlobIterator
• InfiniteIterator
• IteratorIterator
• LimitIterator
• MultipleIterator
• NoRewindIterator
• ParentIterator
• RecursiveArrayIterator
• RecursiveCachingIterator
• RecursiveCallbackFilterIterator
• RecursiveDirectoryIterator
• RecursiveFilterIterator
• RecursiveIteratorIterator
• RecursiveRegexIterator
• RecursiveTreeIterator
• RegexIterator
1. Сложно поддерживать и развивать
2. Невозможно многократно использовать
3. Невозможно протестировать
Что не так с кодом?
Iterator
SPL Iterators
DirectoryIterator и RecursiveDirectoryIterator
Возвращает итератор содержимого папки в формате SplFileInfo
SPL Data Structures
• SplDoublyLinkedList
• SplStack
• SplQueue
• SplHeap
• SplMaxHeap
• SplMinHeap
• SplPriorityQueue
• SplFixedArray
• SplObjectStorage
SPL Data Structures
SplFixedArray
Создает массив фиксированной длинны. Ускоряет работу с массивами, однако
имеет несколько недостатков:
1. Ключи возможны исключительно целочисленный (Int)
2. Операция изменения размера массива налету очень накладна
0=>0
1=>1
2=>2
SPL Data Structures
CPU - 2x2 GHz, 4 Gb
Потребление памяти
Создание 100 000 массивов по 1000 элементов
SPL Data Structures
CPU - 2x2 GHz, 4 Gb
Скорость работы
Создание/итерирование 100 000 массивов по 1000 элементов
SPL Data Structures Производительность
Вставка в
начало
Вставка в
конец
Вставка по
центру
Удаление с
начала
Удаление с
конца
Послед.
чтение
Произвольное
чтение
SplDoublyLinkedList О(1) О(1) О(1) О(1) О(1) О(1) О(n)
SplStack О(1) О(1) О(n) О(1) О(1) О(1) О(n)
SplHeap O(Log n) O(Log n) O(Log n) O(Log n) O(Log n) O(Log n) -
SplPriorityQueue O(Log n) O(Log n) O(Log n) O(Log n) O(Log n) O(Log n) -
SplFixedArray О(1) О(1) О(1) О(1) О(1) О(1) О(1)
PHPArray О(1) О(1) О(1) О(1) О(1) О(1) О(1)
SPL Exceptions
Exception
LogicException RuntimeException
• BadFunctionCallException
• BadMethodCallException
• DomainException
• InvalidArgumentException
• LengthException
• OutOfRangeException
• OutOfBoundsException
• OverflowException
• RangeException
• UnderflowException
• UnexpectedValueException