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.
Don’t let friends use __autoload

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
What went wrong where



EXCEPTIONS
EXCEPTION CLASSES


                  LogicException
BadFunctionCall   InvalidArgument    Domain      Length     OutofRange
   Exception         Exception      Exception   Exception    Exception




BadMethodCall
  Exception
EXCEPTION CLASSES



                     RuntimeException




                                                     Unexpected
OutofBounds   Overflow      Range       UnderflowE      Value
 Exception    Exception   Exception      xception
                                                      Exception
IN THE WILD

ZF2
 https://github.com/zendframework/zf2




 http://ralphschindler.com/2010/09/15/exception-best-practices-in-php-5-3
Yes PHP has a file object
           FILES
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
Magic objects oh my

ARRAYS AS OBJECTS
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
Magic and organization

INTERFACES
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/li
         brary/EmailLabs/Logger.php
    Frapi
       https://github.com/frapi/frapi/blob/master/src/frapi/library/PEAR/
         HTTP/Request2/Observer/Log.php
Take a Drink …

ITERATORS
(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
MORE EXIST
 ParentIterator
 NoRewindIterator
 MultipleIterator
 GlobIterator
 CallbackFilterIterator
 RecursiveCallbackFilterIterator
New ways of managing data

DATASTRUCTURES
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?
GET INVOLVED

http://edit.php.net
Blog posts
Articles
Use SPL in the wild
CONTACT ME

 http://emsmith.net
 https://joind.in/6228
 auroraeosrose@gmail.com
 IRC – freenode – auroraeosrose
 #coapp and others

Spl in the wild

  • 1.
    SPL IN THEWILD The Good, the Bad and the Ugly
  • 2.
    If you don’tknow SPL basics, this talk might go fast for you. Please rate me - Feedback is good!
  • 3.
    Why SPL? What SPL? HowSPL? A library of standard interfaces, classes, and functions designed to solve common programming problems and allow engine overloading
  • 4.
    BUT ISN’T SPLAN 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.
  • 5.
    Don’t let friendsuse __autoload AUTOLOAD
  • 6.
    AUTOLOAD STACK ERRQUEUE spl_autoload_register() spl_autoload_unregister() spl_autoload_call() spl_autoload_functions()  https://gist.github.com/221634
  • 7.
    BEWARE THE WEIRDNESS spl_autoload() lowercase relative paths namespace aware spl_autoload_extensions() include the . no spaces in between comma separated string
  • 8.
    IN THE WILD VanillaForums https://github.com/vanillaforums/Garden https://github.com/vanillaforums/Garden/blob/23 d46ffec12624738fabb4d1917178b4a7872ffd/libra ry/core/functions.general.php
  • 9.
    What went wrongwhere EXCEPTIONS
  • 10.
    EXCEPTION CLASSES LogicException BadFunctionCall InvalidArgument Domain Length OutofRange Exception Exception Exception Exception Exception BadMethodCall Exception
  • 11.
    EXCEPTION CLASSES RuntimeException Unexpected OutofBounds Overflow Range UnderflowE Value Exception Exception Exception xception Exception
  • 12.
    IN THE WILD ZF2 https://github.com/zendframework/zf2 http://ralphschindler.com/2010/09/15/exception-best-practices-in-php-5-3
  • 13.
    Yes PHP hasa file object FILES
  • 14.
    SPLFILEINFO  Metadata abouta 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
  • 15.
    SPLFILEOBJECT  Open filepointer  Extends splfileinfo In the Wild Utils Plugin for CakePHP  https://github.com/CakeDC/utils/blob/master/Mo del/Behavior/CsvImportBehavior.php
  • 16.
    Magic objects ohmy ARRAYS AS OBJECTS
  • 17.
    SPECIFICALLY ARRAYOBJECT  ImplementsArrayAccess (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
  • 18.
  • 19.
    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
  • 20.
    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)
  • 21.
    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
  • 22.
    ITERATOR INTERFACES  OuterIterator  Inner Iterator  Seekable Iterator  For examples, we’ll look at the iterator classes
  • 23.
    SPLSUBJECT SPLOBSERVER  Areyou 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
  • 24.
    Take a Drink… ITERATORS
  • 25.
    (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
  • 26.
    (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
  • 27.
    (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!
  • 28.
    APPENDITERATOR  Keep stackingmore iterators on the end with append  https://github.com/WebToad/FashionPolice/blob/master/libs/Nette/Utils/ Finder.php ParentIterator OuterIterator Iterator Traversable
  • 29.
    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
  • 30.
    FILESYSTEMITERATOR  Extends directoryiterator  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
  • 31.
    (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
  • 32.
    (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
  • 33.
    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
  • 34.
    (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
  • 35.
    EMPTY AND INFINITEITERATORS  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
  • 36.
    MORE EXIST  ParentIterator NoRewindIterator  MultipleIterator  GlobIterator  CallbackFilterIterator  RecursiveCallbackFilterIterator
  • 37.
    New ways ofmanaging data DATASTRUCTURES
  • 38.
    DOUBLYLINKEDLISTS – CSLESSON  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
  • 39.
    SPLDOUBLYLINKEDLIST  Don’t usethis  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
  • 40.
    SPLSTACK  Data isin 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
  • 41.
    SPLQUEUE  Data isin 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
  • 42.
    HEAP – QUICKCS 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
  • 43.
    USING SPLHEAP  Thisis 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
  • 44.
    SPLMINHEAP, SPLMAXHEAP  Theseare 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
  • 45.
    SPLPRIORITYQUEUE  Uses heapinternally  Is non-deterministic when identical priorities are used  https://github.com/ss23/DeBot/blob/master/core/SplFIFOPriorityQueue. php
  • 46.
    SPLFIXEDARRAY  You havea 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
  • 47.
    SPLOBJECTSTORAGE This can beused 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
  • 48.
    WHAT DO YOUWANT TO SEE IN SPL? More standard interface? More datastructures? trees? graphs? More iterators? really? more?
  • 49.
  • 50.
    CONTACT ME  http://emsmith.net https://joind.in/6228  auroraeosrose@gmail.com  IRC – freenode – auroraeosrose  #coapp and others