Владимир Хворостянкин: Standard PHP Library. Зачем оно нам надо?

50
Хворостянкин Владимир PHP Developer [email protected] Standard PHP Library

Transcript of Владимир Хворостянкин: Standard PHP Library. Зачем оно нам надо?

Хворостянкин Владимир

PHP Developer

[email protected]

Standard PHP Library

Основные проблемы:

1. Недостаточно документации

2. Нелогичность названий

3. Примеры если есть, то простейшие или

нерабочие

1. Interfaces

2. Iterators

3. SLP Data structures

4. SPL Data types

5. Exceptions

Interface

Traversable

(обходимый)

Interface

1. Traversable интерфейс, который невозможно реализовать

напрямую в нашем коде

2. Можно только определить, что объект реализует данный

интерфейс

3. Foreach определяет что объект Traversable и меняет логику

своей работы

Interface

Iterator

Interface

Результат:

var1 = 1

var2 = 2

1. Возможность изменять поведение обходных циклов

2. Отделение бизнес логики от логики фильтрации данных

Какой толк от итераторов?

Interface

Создать свой итератор очень просто!

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

Interface

IteratorAggregate

IteratorAggregate используется для объектов, которые должны итерироваться, но итерируемыми сами не являются

Interface

IteratorAggregate

Interface

Countable

Interface

Employees in department - 1

Interface

Employees in department - 2

Interface

Interface

Employees in department - 1

SeekableIterator

Interface

Interface

1. Необходимо реализовать метод seek()

2. Ускоряет работу других итераторов за счет прямого перехода

на искомый элемент

3. Это идеальный вариант для массивов с чтением произвольных

элементов

Interface

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

Iterator

Пример из жизни

Пример из жизни

Iterator

Пример из жизни

Iterator

Пример из жизни

Iterator

1. Сложно поддерживать и развивать

2. Невозможно многократно использовать

3. Невозможно протестировать

Что не так с кодом?

Iterator

Iterator

Iterator

Iterator

Iterator

SPL Iterators

DirectoryIterator и RecursiveDirectoryIterator

Возвращает итератор содержимого папки в формате SplFileInfo

SPL Iterators

AppendIterator

Соединяет несколько итераторов в один

SPL Data Structures

SPL Data Structures

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

PHP 5.6, CPU - 2x2 GHz, 4 Gb

Потребление памяти

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 Data Structures

SPL Data Types

SPL Data Types

• SplInt

• SplFloat

• SplEnum

• SplBool

• SplString

SPL Data Types

Spl Enum

SPL Data Types

SplInt

Value not an integer

94

SPL Data Types

SplFloat

не всё так хорошо

SPL Data Structures

SPL Exceptions

SPL Exceptions

Exception

LogicException RuntimeException

• BadFunctionCallException

• BadMethodCallException

• DomainException

• InvalidArgumentException

• LengthException

• OutOfRangeException

• OutOfBoundsException

• OverflowException

• RangeException

• UnderflowException

• UnexpectedValueException

SPL Exceptions

Никогда не бросайте Exception

Всегда ловите Exception

Спасибо за внимание!

Вопросы?