spl in the wild
TRANSCRIPT
SPL IN THE WILD The Good, the Bad and the Ugly
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.
AUTOLOAD
Don’t let friends use __autoload
AUTOLOAD STACK ERR QUEUE
spl_autoload_register()
spl_autoload_unregister()
spl_autoload_call()
spl_autoload_functions()
https://gist.github.com/221634
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
EXCEPTIONS What went wrong where
EXCEPTION CLASSES
LogicException
BadFunctionCall
Exception
BadMethodCall
Exception
InvalidArgument
Exception
Domain
Exception
Length
Exception
OutofRange
Exception
EXCEPTION CLASSES
RuntimeException
OutofBounds
Exception
Overflow
Exception
Range
Exception
UnderflowException
UnexpectedValue
Exception
IN THE WILD
ZF2
https://github.com/zendframework/zf2
http://ralphschindler.com/2010/09/15/exception-best-practices-in-php-5-3
FILES Yes PHP has a file object
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
ARRAYS AS OBJECTS
Magic objects oh my
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
INTERFACES
Magic and organization
QUICK TANGENT
Traversable
(none)
Iterator
https://github.com/tyohan/WordPress-MVC-
Framework/blob/11c4c550bf95bed9b142efa46200c9433
0350105/TPostList.php
IteratorAggregate
https://github.com/lox/pheasant/blob/d3f4b0806eceb81e
0351a45d98eb1506134e6b56/lib/Pheasant/Identity.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/library/EmailLabs/Logger.php
Frapi
https://github.com/frapi/frapi/blob/master/src/frapi/library/PEAR/HTTP/Request2/Observer/Log.php
ITERATORS
Take a Drink …
(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
ArrayIterator
SeekableIterator
Iterator Traversable ArrayAccess
and Countable 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
RecursiveCachingIterator
CachingIterator OuterIterator Iterator Traversable
CachingIterator OuterIterator Iterator Traversable
(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
RecursiveTreeIterator
RecursiveIteratorIterator
OuterIterator Iterator Traversable
(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
InfiniteIterator IteratorIterator Iterator Traversable
EmptyIterator Iterator Traversable
MORE EXIST
ParentIterator
NoRewindIterator
MultipleIterator
GlobIterator
CallbackFilterIterator
RecursiveCallbackFilterIterator
DATASTRUCTURES
New ways of managing data
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/fauxThreadPool.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/QueryPath/CssEventHandler.php
WHAT DO YOU WANT TO SEE IN SPL?
More standard interface?
More datastructures?
trees?
graphs?
More iterators? really? more?
CONTACT ME
http://emsmith.net
https://joind.in/6228
IRC – freenode – auroraeosrose
#coapp and others