Spl in the wild


Published on

Published in: Technology
  • Be the first to comment

No Downloads
Total views
On SlideShare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide

Spl in the wild

  1. 1. SPL IN THE WILDThe Good, the Bad and the Ugly
  2. 2. If you don’t know SPLbasics, this talk might gofast for you.Please rate me -Feedback is good!
  3. 3. Why SPL?What SPL?How SPL? A library of standard interfaces, classes, and functions designed to solve common programming problems and allow engine overloading
  4. 4. 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.
  5. 5. Don’t let friends use __autoloadAUTOLOAD
  6. 6. AUTOLOAD STACK ERR QUEUEspl_autoload_register()spl_autoload_unregister()spl_autoload_call()spl_autoload_functions() https://gist.github.com/221634
  7. 7. BEWARE THE WEIRDNESSspl_autoload() lowercase relative paths namespace awarespl_autoload_extensions() include the . no spaces in between comma separated string
  8. 8. IN THE WILDVanilla Forums https://github.com/vanillaforums/Garden https://github.com/vanillaforums/Garden/blob/23 d46ffec12624738fabb4d1917178b4a7872ffd/libra ry/core/functions.general.php
  9. 9. What went wrong whereEXCEPTIONS
  10. 10. EXCEPTION CLASSES LogicExceptionBadFunctionCall InvalidArgument Domain Length OutofRange Exception Exception Exception Exception ExceptionBadMethodCall Exception
  11. 11. EXCEPTION CLASSES RuntimeException UnexpectedOutofBounds Overflow Range UnderflowE Value Exception Exception Exception xception Exception
  12. 12. IN THE WILDZF2 https://github.com/zendframework/zf2 http://ralphschindler.com/2010/09/15/exception-best-practices-in-php-5-3
  13. 13. Yes PHP has a file object FILES
  14. 14. 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
  15. 15. 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
  16. 16. Magic objects oh myARRAYS AS OBJECTS
  17. 17. 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
  18. 18. Magic and organizationINTERFACES
  19. 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. 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. 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. 22. ITERATOR INTERFACES Outer Iterator Inner Iterator Seekable Iterator For examples, we’ll look at the iterator classes
  23. 23. 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
  24. 24. Take a Drink …ITERATORS
  25. 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. 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. 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.phpArrayIter SeekableI ArrayAccess Iterator Traversable and Countable ator terator too!
  28. 28. 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
  29. 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. 30. 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
  31. 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 TraversableRecursiveCach CachingIterator OuterIterator Iterator Traversable ingIterator
  32. 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. 33. RECURSIVETREEITERATOR Regular Class Can create an ascii graphic tree (seriously…) https://github.com/Respect/Validation/blob/master/library/Respect/Valida tion/Exceptions/AbstractNestedException.phpRecursiveTr RecursiveItera OuterIterator Iterator Traversable eeIterator torIterator
  34. 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. 35. 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
  36. 36. MORE EXIST ParentIterator NoRewindIterator MultipleIterator GlobIterator CallbackFilterIterator RecursiveCallbackFilterIterator
  37. 37. New ways of managing dataDATASTRUCTURES
  38. 38. 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
  39. 39. 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
  40. 40. 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
  41. 41. 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
  42. 42. 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
  43. 43. 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
  44. 44. 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
  45. 45. SPLPRIORITYQUEUE Uses heap internally Is non-deterministic when identical priorities are used https://github.com/ss23/DeBot/blob/master/core/SplFIFOPriorityQueue. php
  46. 46. 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
  47. 47. 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
  48. 48. WHAT DO YOU WANT TO SEE IN SPL?More standard interface?More datastructures? trees? graphs?More iterators? really? more?
  49. 49. GET INVOLVEDhttp://edit.php.netBlog postsArticlesUse SPL in the wild
  50. 50. CONTACT ME http://emsmith.net https://joind.in/6228 auroraeosrose@gmail.com IRC – freenode – auroraeosrose #coapp and others