Successfully reported this slideshow.
Your SlideShare is downloading. ×

SPL, not a bridge too far

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Loading in …3
×

Check these out next

1 of 42 Ad

SPL, not a bridge too far

Download to read offline

With this presentation I hope to show that using SPL doesn't require a PHD and that it really benefits your application design, maintainability and implements best practices to solve common development problems.

With this presentation I hope to show that using SPL doesn't require a PHD and that it really benefits your application design, maintainability and implements best practices to solve common development problems.

Advertisement
Advertisement

More Related Content

Slideshows for you (20)

Similar to SPL, not a bridge too far (20)

Advertisement

More from Michelangelo van Dam (20)

Recently uploaded (20)

Advertisement

SPL, not a bridge too far

  1. 1. SPL, not a bridge too far Dutch PHP Conference 2009 - Amsterdam
  2. 2. Who am I ? Michelangelo van Dam Independent Enterprise PHP consultant @dragonbe http://dragonbe.com 2
  3. 3. Who are you ? You know OOP ? You know php.net ? You know arrays ? 3
  4. 4. What is SPL ? Standard PHP Library interfaces, classes and methods solve common development problems As of 5.3 SPL cannot be turned off from the source ! 4
  5. 5. Why use SPL ? SPL provides a huge toolkit that assists you to easily iterate over a diversity of data structures in a standardized way 5
  6. 6. What does it provide ? • ArrayObject - approach arrays as objects • Iterators - various iterators • Interfaces - Countable Interface • Exceptions - exceptions to streamline errorhandling • SPL Functions - extra functions and autoloader func • SplFileInfo - tools for filesystem access • Datastructures - structuring data sequences 6
  7. 7. ArrayObject • provides an interface - treat arrays as objects - elements are iteratable 7
  8. 8. ArrayObject methods • ArrayObject::append • ArrayObject::__construct • ArrayObject::count • ArrayObject::getIterator • ArrayObject::offsetExists • ArrayObject::offsetGet • ArrayObject::offsetSet • ArrayObject::offsetUnset 8
  9. 9. <?php ArrayObject w/o SPL // file: nospl_arrayobject01.php $myArray = array ( quot;monkeyquot; => quot;bananasquot;, quot;rabbitquot; => quot;carrotsquot;, quot;ogrequot; => quot;onionsquot;, ); echo quot;Ogres exists ? quot; . (key_exists('ogre', $myArray) ? quot;Yesquot; : quot;Noquot;) . quot;nquot;; echo quot;Ogres equals quot; . $myArray['ogre'] . quot;nquot;; 9
  10. 10. <?php ArrayObject Example // file: spl_arrayobject01.php $myArray = array ( quot;monkeyquot; => quot;bananasquot;, quot;rabbitquot; => quot;carrotsquot;, quot;ogrequot; => quot;onionsquot;, ); // create an object of the array $arrayObj = new ArrayObject($myArray); echo quot;Ogres exists ? quot; . ($arrayObj->offsetExists(quot;ogrequot;) ? quot;Yesquot; : quot;Noquot;) . quot;nquot;; echo quot;Ogres equals quot; . $arrayObj->offsetGet(quot;ogrequot;) . quot;nquot;; 10
  11. 11. ArrayObject Output $ /usr/bin/php ./nospl_arrayobject01.php Ogres exists ? Yes Ogres equals onions Execution time: 0.00064299999999995 microseconds. $ /usr/bin/php ./spl_arrayobject01.php Ogres exists ? Yes Ogres equals onions Execution time: 0.00054399999999999 microseconds. 11
  12. 12. Iterator • move back and forth in a stack • distinct methods to access keys and values 12
  13. 13. Iterators • ArrayIterator • CachingIterator • RecursiveCachingIterator • DirectoryIterator • RecursiveDirectoryIterator • FilterIterator • LimitIterator • ParentIterator • RecursiveIteratorIterator 13
  14. 14. The ArrayIterator iteration methods on array objects 14
  15. 15. ArrayIterator Example Case • Array with 3 elements - monkey => bananas, - rabbit => carrots, - ogre => onions • display total elements • display key/value pairs while looping • display key/value pair for 2nd element 15
  16. 16. <?php ArrayIterator w/o SPL // file: nospl_iterator01.php $myArray = array ( quot;monkeyquot; => quot;bananasquot;, quot;rabbitquot; => quot;carrotsquot;, quot;ogrequot; => quot;onionsquot;, ); echo quot;$myArray has {sizeof($myArray)} elementsnquot;; foreach ($myArray as $key => $value) { echo quot;{$key}: {$value}nquot;; } reset($myArray); next($myArray); echo quot;elem 2:quot; . key($myArray) . quot;: quot; . current($myArray) . quot;nquot;; 16
  17. 17. <?php ArrayIterator w/ SPL // file: spl_iterator01.php $myArray = array ( “monkey” => “bananas”, “rabbit” => “carrots”, “ogre” => “onions”, ); $arrayObj = new ArrayObject($myArray); $iterator = $arrayObj->getIterator(); echo quot;$myArray has {$arrayObj->count()} elementsnquot;; while ($iterator->valid()) { echo quot;{$iterator->key()}: {$iterator->current()}nquot;; $iterator->next(); } $iterator->seek(1); echo quot;elem 2:{$iterator->key()}: {$iterator->current()}nquot;; 17
  18. 18. ArrayIterator Output $ /usr/bin/php ./nospl_iterator01.php $myArray has 3 elements monkey: bananas rabbit: carrots ogre: onions elem 2:rabbit: carrots Execution time: 0.0020509999999999 microseconds. $ /usr/bin/php ./spl_iterator01.php $myArray has 3 elements monkey: bananas rabbit: carrots ogre: onions elem 2:rabbit: carrots Execution time: 0.001346 microseconds. 18
  19. 19. Interfaces • Countable - provides an internal counter • SeekableIterator - provides an internal stack seeker 19
  20. 20. <?php Countable Example //file: spl_countable01.php class TequillaCounter implements Countable { public function count() { static $count = 0; return ++$count; } public function order() { $order = $this->count(); echo ($order > 3 ? quot;Floor!quot; : quot;{$order} tequillaquot;) . PHP_EOL; } } 20
  21. 21. Countable continued... $shots = new TequillaCounter(); $shots->order(); $shots->order(); $shots->order(); $shots->order(); Output: $ /usr/bin/php ./countable01.php 1 tequilla 2 tequilla 3 tequilla Floor! 21
  22. 22. SPL Exceptions • SPL Exceptions - templates - throw exceptions - common issues • Types of exceptions - LogicExceptions - RuntimeExceptions 22
  23. 23. SPL LogicException Tree 23
  24. 24. SPL RuntimeException Tree 24
  25. 25. <?php Exceptions Example //file: spl_exception01.php class MyClass { public function giveANumberFromOneToTen($number) { if($number < 1 || $number > 10) { throw new OutOfBoundsException('Number should be between 1 and 10'); } echo $number . PHP_EOL; } } $my = new MyClass(); try { $my->giveANumberFromOneToTen(5); $my->giveANumberFromOneToTen(20); } catch (OutOfBoundsException $e) { echo $e->getMessage() . PHP_EOL; } Output: $ /usr/bin/php ./spl_exception01.php 5 Number should be between 1 and 10 25
  26. 26. SPL Functions • class_implements Return the interfaces which are implemented by the given class • class_parents Return the parent classes of the given class • iterator_apply Apply a user function to every element of an iterator • iterator_count Count the elements in an iterator • iterator_to_array Copy the iterator into an array • spl_autoload_call Try all registered __autoload() function to load requested class 26
  27. 27. SPL Functions (2) • spl_autoload_functions Return all registered __autoload() functions • spl_autoload_register Register given function as __autoload() implementation • spl_autoload_unregister Unregister given function as __autoload() implementation • spl_autoload Default implementation for __autoload() • spl_classes Return available SPL classes • spl_object_hash Return hash id for given object 27
  28. 28. <?php SplFunctions Example interface foo {} interface bar {} class baz implements foo, bar {} class example extends baz {} var_dump(class_implements(new baz)); var_dump(class_implements(new example)); 28
  29. 29. Output of SplFunctions array(2) { [quot;fooquot;]=> string(3) quot;fooquot; [quot;barquot;]=> string(3) quot;barquot; } array(2) { [quot;barquot;]=> string(3) quot;barquot; [quot;fooquot;]=> string(3) quot;fooquot; } 29
  30. 30. SplFileInfo • SplFileInfo::__construct • SplFileInfo::getLinkTarget • SplFileInfo::getATime • SplFileInfo::getMTime • SplFileInfo::getBasename • SplFileInfo::getOwner • SplFileInfo::getCTime • SplFileInfo::getPath • SplFileInfo::getFileInfo • SplFileInfo::getPathInfo • SplFileInfo::getFilename • SplFileInfo::getPathname • SplFileInfo::getGroup • SplFileInfo::getPerms • SplFileInfo::getInode 30
  31. 31. SplFileInfo (2) • SplFileInfo::getRealPath • SplFileInfo::isReadable • SplFileInfo::getSize • SplFileInfo::isWritable • SplFileInfo::getType • SplFileInfo::openFile • SplFileInfo::isDir • SplFileInfo::setFileClass • SplFileInfo::isExecutable • SplFileInfo::setInfoClass • SplFileInfo::isFile • SplFileInfo::__toString • SplFileInfo::isLink 31
  32. 32. <?php SplFileInfo Example // use the current file to get information from $file = new SplFileInfo(dirname(__FILE__)); var_dump($file->isFile()); var_dump($file->getMTime()); var_dump($file->getSize()); var_dump($file->getFileInfo()); var_dump($file->getOwner()); //output bool(false) int(1244760945) int(408) object(SplFileInfo)#2 (0) { } int(501) 32
  33. 33. Data Structures • Available in PHP 5.3.x - SplDoublyLinkedList ✓ SplStack ✓ SplQueue ✓ SplHeap ✓ SplMaxHeap ✓ SplMinHeap ✓ SplPriorityQueue 33
  34. 34. Data Structures Example <?php // file: spl_stack01.php $stack = new SplStack(); $stack->push('Message 1'); $stack->push('Message 2'); $stack->push('Message 3'); echo $stack->pop() . PHP_EOL; echo $stack->pop() . PHP_EOL; echo $stack->pop() . PHP_EOL; Outputs: $ /usr/bin/php ./spl_stack01.php Message 3 Message 2 Message 1 34
  35. 35. Not a bridge too far... 35
  36. 36. Conclusion SPL can help you solve common PHP issues it’s built-in, so why not use it it requires no “advanced skills” to use 36
  37. 37. Only one minor thing... 37
  38. 38. Documentation problem • php.net/spl needs more documentation ! • you can help on that part: - see http://elizabethmariesmith.com/2009/02/setting-up-phd-on-windows - you can set up phpdoc on each platform ! - Efnet: #php.doc channel - http://doc.php.net - phpdoc@php.net 38
  39. 39. More about SPL... • main SPL documentation: http://php.net/spl • PHPro Tutorials on SPL: http://www.phpro.org/tutorials/Introduction-to-SPL.html • Lorenzo Alberton’s blog: http://www.alberton.info/php_5.3_spl_data_structures.html • http://www.colder.ch/news/01-08-2009/34/splobjectstorage-for- a-fa.html 39
  40. 40. License This presentation is released under the Creative Commons Attribution-Share Alike 3.0 Unported License You are free: - to share : to copy, distribute and transmit the work - to remix : to adapt the work Under the following conditions: - attribution :You must attribute the work in the manner specified by the author or licensor - share alike : If you alter, transform, or build upon this work, you may distribute the resulting work only under the same, similar or a compatible license See: http://creativecommons.org/licenses/by-sa/3.0/ 40
  41. 41. Credits Golden Gate Bridge - Felix De Vliegher http://www.flickr.com/photos/felixdv/2883471022/ 41
  42. 42. Thank you Find my slides on http://slideshare.net/DragonBe Don’t forget to vote ! http://joind.in/586 42

Editor's Notes

  • Promotion of SPL



  • Definition of SPL

  • SPL functions
    - base class functions
    - autoloading functions




































×