If you don’t know SPL
basics, this talk might go
fast for you.
Please rate me -
Feedback is good!
Why SPL?
What SPL?
How SPL?
A library of standard interfaces,
classes, and functions designed to
solve common programming
problems and allow engine
overloading
BUT ISN’T SPL AN EXTENSION?
SPL is an extension
SPL is a core extension
SPL cannot be built shared
SPL should not be turned off
SPL is present in PHP since 5.0 (almost 5 years ago)
As of 5.3, SPL cannot be turned off
If you don’t have SPL, whoever built your PHP is an idiot.
BEWARE THE WEIRDNESS
spl_autoload()
lowercase
relative paths
namespace aware
spl_autoload_extensions()
include the .
no spaces in between
comma separated string
IN THE WILD
Vanilla Forums
https://github.com/vanillaforums/Garden
https://github.com/vanillaforums/Garden/blob/23
d46ffec12624738fabb4d1917178b4a7872ffd/libra
ry/core/functions.general.php
SPLFILEINFO
Metadata about a file
Returned by directory iterators
Can set your own superclass for splfileinfo/splfileobject
In the Wild
phpcmc
https://github.com/fqqdk/phpcmc/blob/master/tests/p
hpcmc/micro/PhpLinterTest.php
SPLFILEOBJECT
Open file pointer
Extends splfileinfo
In the Wild
Utils Plugin for CakePHP
https://github.com/CakeDC/utils/blob/master/Mo
del/Behavior/CsvImportBehavior.php
SPECIFICALLY ARRAYOBJECT
Implements ArrayAccess (with references)
Implements Countable
Implements IteratorAggregate
Implements Serializable (since 5.3.0)
And other methods that arrays can use (but not all)
In the Wild
Rapide Framework
https://github.com/Hanse/rapide-
framework/blob/master/lib/Rapide/Utility/ArrayObject.php
MORE CORE INTERFACES
ArrayAccess
https://github.com/tidal/PEIP/blob/master/src/event/PEIP_
Event.php
Serializable
https://github.com/shizzard/RAPIClient/blob/master/Help
er/Storage.php
Closure
Do not use (seriously)
SPL - COUNTABLE
Interface meaning “you can count me”
Can be put on any class
Makes count() magical
Note this is NOT the same as iterator_count()
https://github.com/ysbaddaden/php5-
redis/blob/master/lib/Redis/Servers.php
ITERATOR INTERFACES
Outer Iterator
Inner Iterator
Seekable Iterator
For examples, we’ll look at the iterator classes
SPLSUBJECT SPLOBSERVER
Are you implementing the observer pattern in your code?
Do you intend to have other people use your code/library in some way?
Are you implementing something LIKE the observer pattern?
In the Wild
EmailLabs_Sync (SplSubject)
https://github.com/sankovicmarko/EmailLabs_Sync/blob/master/li
brary/EmailLabs/Logger.php
Frapi
https://github.com/frapi/frapi/blob/master/src/frapi/library/PEAR/
HTTP/Request2/Observer/Log.php
(RECURSIVE)FILTERITERATOR
Abstract Class
Has one method that must be implemented – accept – which should
return true or false
Highly useful for many types of iteration
https://github.com/nishimura/laiz/blob/master/laiz/builder/AutoIncludeFil
ter.php
https://github.com/ralphschindler/PHPTools/blob/master/library/PHPToo
ls/Namespacer/RecursiveFilterIterator.php
FilterIterator OuterIterator Iterator Traversable
(RECURSIVE)ITERATORITERATOR
Regular Class
Stick in something that implements traversable
Instant Iterator
https://github.com/halfnelson/LINQ4PHP/blob/master/Iterators/Transfor
mIterator.php
https://github.com/symfony/symfony/blob/master/src/Symfony/Compone
nt/Finder/Iterator/DepthRangeFilterIterator.php
IteratorIterator OuterIterator Iterator Traversable
(RECURSIVE)ARRAYITERATOR
Regular Class
Iterates an array – OR the public properties of an object! (neat trick –
dirty trick)
https://github.com/diggin/Diggin_Service_Wedata/blob/master/src/Diggin
/Service/Wedata/Items.php
https://github.com/Respect/Validation/blob/master/library/Respect/Valida
tion/ExceptionIterator.php
ArrayIter SeekableI ArrayAccess
Iterator Traversable and Countable
ator terator too!
APPENDITERATOR
Keep stacking more iterators on the end with append
https://github.com/WebToad/FashionPolice/blob/master/libs/Nette/Utils/
Finder.php
ParentIterator OuterIterator Iterator Traversable
LIMITITERATOR
Regular Class
Like mysql’s limit – pick your range and offset and foreach away!
https://github.com/jasir/ComponentTreePanel/blob/master/ComponentT
reePanel.php
LimitIterator OuterIterator Iterator Traversable
FILESYSTEMITERATOR
Extends directory iterator
Lets you choose how to get data (just string names possible)
https://github.com/KnpLabs/Gaufrette/blob/master/tests/Gaufrette/Adap
ter/LocalTest.php
FileSystemIterator DirectoryIterator Iterator Traversable
(RECURSIVE)CACHINGITERATOR
Regular Class
Manages another iterator by checking whether it has more elements
each time using a hasNext() method
https://github.com/bshaffer/Donate-
Nashville/blob/master/plugins/sfPhpExcelPlugin/lib/PHPExcel/PHPExcel/
Worksheet/RowIterator.php
CachingIterator OuterIterator Iterator Traversable
RecursiveCach CachingIterator OuterIterator Iterator Traversable
ingIterator
(RECURSIVE)DIRECTORYITERATOR
Regular Class
Walk a Directory
https://github.com/quentinhill/curator/blob/master/Curator/Project.php
https://github.com/spidee/PHP-
Framework/blob/master/libs/Smarty/sysplugins/smarty_internal_utility.p
hp
DirectoryIterator SplFIieInfo Iterator Traversable
RecursiveDirectoryIteerator DirectoryIterator
RECURSIVETREEITERATOR
Regular Class
Can create an ascii graphic tree (seriously…)
https://github.com/Respect/Validation/blob/master/library/Respect/Valida
tion/Exceptions/AbstractNestedException.php
RecursiveTr RecursiveItera
OuterIterator Iterator Traversable
eeIterator torIterator
(RECURSIVE)REGEXITERATOR
Regular Class
Filter an iterator by a regex
Pick how you want it to match
https://github.com/felipensp/php-
tools/blob/master/bughunter/bughunter.php
https://github.com/lgunsch/victorycms-
core/blob/master/lib/utilities/Vcms-FileUtils.php
RegexIterator FilterIterator Iterator Traversable
RecursiveRegexIteerator RegexIterator
EMPTY AND INFINITE ITERATORS
In the Wild – EmptyIterator
https://github.com/evilgeny/bob/blob/master/romir/projects/libraries/Bar
code/Mapper.class.php
Infinite? Really only useful for testing
EmptyIterator Iterator Traversable
InfiniteIterator IteratorIterator Iterator Traversable
DOUBLYLINKEDLISTS – CS LESSON
ordered collection of values
linked to each element before it
linked to each element after it
“doubly linked”
PHP datastructure – a php object with a doublylinkedlist stored inside it
SPLDOUBLYLINKEDLIST
Don’t use this
Yes, that’s a terrible thing to say – but this is really nothing more then a
“base class” with little to recommend on its own
Has a doublylinkedlist from C underneath instead of a hashtable – if you
know what that means you may find a real use for this (I have not)
https://github.com/osebboy/Notification/blob/master/src/Notification/Di
spatcher.php
SPLSTACK
Data is in LIFO
Anything you need to iterate a lot
Even cooler? Turn on the mode that will autodelete each item as you
process it
Any Queue you need to push stuff onto and deal with in LIFO order
https://github.com/rsesek/phalanx/blob/master/tasks/task_pump.php
SPLQUEUE
Data is in FIFO
Anything you need to iterate a lot
Even cooler? Turn on the mode that will autodelete each item as you
process it
Any Queue you need to push stuff onto and deal with in LIFO order
https://github.com/matthewshafer/fauxThread/blob/master/src/fauxThre
adPool.php
HEAP – QUICK CS LESSON
comparison function used to compare the new element to other
elements
element is placed according to functions return value
underlying algorithm does it with minimal comparisons
PHP datastructure – a php object with a heap stored inside it
USING SPLHEAP
This is an abstract class
You need to compare elements
https://github.com/ckwalsh/LibSprite
https://github.com/ckwalsh/LibSprite/blob/master/src/php5_3/CKWalsh/
LibSprite/Util/Block/Heap/Width.php
https://github.com/ckwalsh/LibSprite/blob/master/src/php5_3/CKWalsh/
LibSprite/Packer/GreedyHeap.php
SPLMINHEAP, SPLMAXHEAP
These are concrete heap implementations, designed to grab the lowest
possible value out, or the highest possible
https://github.com/tobyS/php-
snippets/blob/master/datastructures/bottom_k.php
https://github.com/stormbreakerbg/A---A-Star--pathfinding-class-in-
PHP/blob/master/AStarWithHeap.php
SPLPRIORITYQUEUE
Uses heap internally
Is non-deterministic when identical priorities are used
https://github.com/ss23/DeBot/blob/master/core/SplFIFOPriorityQueue.
php
SPLFIXEDARRAY
You have a large amount of data, you know the final size, you need to
stick it into an array
You’re not going to expand it past the final size
This is not a small amount of data
You might need it in non-sequential order but can handle having only
integers for keys
https://github.com/cboden/gClient/blob/master/lib/gClient/Calendar/Cal
endar.php
SPLOBJECTSTORAGE
This can be used two ways
Objects can be keys in an array (with two
values)
As a Set (with one value)
https://github.com/greggles/epm_project_management/blob/master/Que
ryPath/CssEventHandler.php
WHAT DO YOU WANT TO SEE IN SPL?
More standard interface?
More datastructures?
trees?
graphs?
More iterators? really? more?