SPL, not a bridge too far
Dutch PHP Conference 2009 - Amsterdam
Who am I ?

Michelangelo van Dam
Independent Enterprise PHP consultant


@dragonbe

http://dragonbe.com




              2
Who are you ?


   You know OOP ?
  You know php.net ?
   You know arrays ?




         3
What is SPL ?

               Standard PHP Library
           interfaces, classes and methods
       solve common developm...
Why use SPL ?


SPL provides a huge toolkit that assists you to easily
iterate over a diversity of data structures in a
st...
What does it provide ?
•   ArrayObject - approach arrays as objects
•   Iterators - various iterators
•   Interfaces - Cou...
ArrayObject


•   provides an interface
    - treat arrays as objects
    - elements are iteratable



                   ...
ArrayObject methods
•   ArrayObject::append
•   ArrayObject::__construct
•   ArrayObject::count
•   ArrayObject::getIterat...
<?php
      ArrayObject w/o SPL
// file: nospl_arrayobject01.php

$myArray =   array (
  quot;monkeyquot;   => quot;banana...
<?php
      ArrayObject Example
// file: spl_arrayobject01.php

$myArray =   array (
  quot;monkeyquot;   => quot;bananasq...
ArrayObject Output
$ /usr/bin/php ./nospl_arrayobject01.php
Ogres exists ? Yes
Ogres equals onions
Execution time: 0.00064...
Iterator


•   move back and forth in a stack
•   distinct methods to access keys and values




                         ...
Iterators
•   ArrayIterator
•   CachingIterator
•   RecursiveCachingIterator
•   DirectoryIterator
•   RecursiveDirectoryI...
The ArrayIterator


iteration methods on array objects




                14
ArrayIterator Example Case
•   Array with 3 elements
    - monkey => bananas,
    - rabbit => carrots,
    - ogre => onion...
<?php
     ArrayIterator w/o SPL
// file: nospl_iterator01.php
$myArray = array (
    quot;monkeyquot; => quot;bananasquot...
<?php
       ArrayIterator w/ SPL
// file: spl_iterator01.php
$myArray = array (
  “monkey” => “bananas”,
  “rabbit” => “c...
ArrayIterator Output
$ /usr/bin/php ./nospl_iterator01.php
$myArray has 3 elements
monkey: bananas
rabbit: carrots
ogre: o...
Interfaces

•   Countable
    - provides an internal counter
•   SeekableIterator
    - provides an internal stack seeker
...
<?php
           Countable Example
//file: spl_countable01.php
class TequillaCounter implements Countable
{
    public fun...
Countable continued...
$shots = new TequillaCounter();
$shots->order();
$shots->order();
$shots->order();
$shots->order();...
SPL Exceptions
•   SPL Exceptions
    - templates
    - throw exceptions
    - common issues
•   Types of exceptions
    -...
SPL LogicException Tree




           23
SPL RuntimeException Tree




            24
<?php
           Exceptions Example
//file: spl_exception01.php
class MyClass
{
    public function giveANumberFromOneToTe...
SPL Functions
•   class_implements
    Return the interfaces which are implemented by the given class
•   class_parents
  ...
SPL Functions (2)
•   spl_autoload_functions
    Return all registered __autoload() functions
•   spl_autoload_register
  ...
<?php
        SplFunctions Example
interface foo {}
interface bar {}

class baz implements foo, bar {}
class example exten...
Output of SplFunctions
array(2) {
  [quot;fooquot;]=>
  string(3)   quot;fooquot;
  [quot;barquot;]=>
  string(3)   quot;b...
SplFileInfo
•   SplFileInfo::__construct        •   SplFileInfo::getLinkTarget
•   SplFileInfo::getATime           •   Spl...
SplFileInfo (2)
•   SplFileInfo::getRealPath         •   SplFileInfo::isReadable
•   SplFileInfo::getSize             •   ...
<?php
         SplFileInfo Example
// use the current file to get information from
$file = new SplFileInfo(dirname(__FILE_...
Data Structures
•   Available in PHP 5.3.x

    -   SplDoublyLinkedList
        ✓ SplStack
        ✓ SplQueue
        ✓ Sp...
Data Structures Example
<?php
// file: spl_stack01.php
$stack = new SplStack();
$stack->push('Message 1');
$stack->push('M...
Not a bridge too far...




           35
Conclusion


SPL can help you solve common PHP issues
        it’s built-in, so why not use it
   it requires no “advanced...
Only one minor thing...




           37
Documentation problem

•   php.net/spl needs more documentation !
•   you can help on that part:
    - see http://elizabet...
More about SPL...
•   main SPL documentation:
    http://php.net/spl
•   PHPro Tutorials on SPL:
    http://www.phpro.org/...
License
This presentation is released under the Creative Commons
Attribution-Share Alike 3.0 Unported License
You are free...
Credits


Golden Gate Bridge - Felix De Vliegher
http://www.flickr.com/photos/felixdv/2883471022/




                     ...
Thank you

        Find my slides on
http://slideshare.net/DragonBe

    Don’t forget to vote !
     http://joind.in/586

...
Upcoming SlideShare
Loading in...5
×

SPL, not a bridge too far

3,910

Published on

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.

Published in: Technology
0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,910
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
107
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide
  • Promotion of SPL



  • Definition of SPL

  • SPL functions
    - base class functions
    - autoloading functions




































  • 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
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×