44
SPL: The Missing Link in Development Jake Smith Dallas PHP - 7/13/2010

SPL: The Missing Link in Development

Embed Size (px)

Citation preview

Page 1: SPL: The Missing Link in Development

SPL: The Missing Link in DevelopmentJake SmithDallas PHP - 7/13/2010

Page 2: SPL: The Missing Link in Development

What is SPL?

• A  library  of  standard  interfaces,  classes,  and  functions  designed  to  solve  common  programming  problems  and  allow  engine  overloading.

Definition Source: http://elizabethmariesmith.com/

Page 3: SPL: The Missing Link in Development

SPL Background

• Provides Interfaces, Classes and Functions

• As of PHP 5.3 you can not turn off SPL

• Poor documentation root of poor adoption.

Page 4: SPL: The Missing Link in Development

SPL Autoloading

Page 5: SPL: The Missing Link in Development

Before SPL Autoloadset_include_path(dirname(__FILE__) . '/lib' . PATH_SEPARATOR . get_include_path());function __autoload($class_name) { $path = dirname(__FILE__) . '/lib/' . str_replace('_', '/', strtolower($class_name)) . '.php'; if (file_exists($path)) { require $path; } else { die('Class ' . $path . ' Not Found'); }}

<?phpclass Form_Element_Text extends Form_Element{ public function __construct($name = '', $attrs = array()) { $this->_name = $name; $this->_attrs = $attrs; }

Class Name

Page 6: SPL: The Missing Link in Development

Autoloading w/SPL<?php /*** nullify any existing autoloads ***/ spl_autoload_register(null, false);

/*** specify extensions that may be loaded ***/ spl_autoload_extensions('.php, .class.php');

/*** class Loader ***/ function classLoader($class) { $filename = strtolower($class) . '.class.php'; $file ='classes/' . $filename; if (!file_exists($file)) { return false; } include $file; }

/*** register the loader functions ***/ spl_autoload_register('classLoader');

Example Source: http://www.phpro.org/tutorials/SPL-Autoload.html

Page 7: SPL: The Missing Link in Development

Multiple Autoloaders

<?php /*** nullify any existing autoloads ***/ spl_autoload_register(null, false); spl_autoload_register(array('Doctrine_Core', 'autoload')); spl_autoload_register(array('Doctrine_Core', 'modelsAutoload'));

Page 8: SPL: The Missing Link in Development

Multiple Autoloaders<?phpclass Doctrine_Core{ public static function autoload($className) { if (strpos($className, 'sfYaml') === 0) { require dirname(__FILE__) . '/Parser/sfYaml/' . $className . '.php';

return true; }

if (0 !== stripos($className, 'Doctrine_') || class_exists($className, false) || interface_exists($className, false)) { return false; }

$class = self::getPath() . DIRECTORY_SEPARATOR . str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';

if (file_exists($class)) { require $class;

return true; }

return false; }

Page 9: SPL: The Missing Link in Development

SPL Functions

Page 10: SPL: The Missing Link in Development

iterator_to_array

• Takes an iterator object, an object that implements Traversable

• All iterators implement Traversable

Page 11: SPL: The Missing Link in Development

spl_object_hash

• MD5 hash of internal pointer

• When objects are destroyed their object hash is released

• Object Hash ID can/will be reused after destruction.

Page 12: SPL: The Missing Link in Development

SPL Classes

• ArrayObject

• SplFileInfo

Page 13: SPL: The Missing Link in Development

ArrayObject

• Allows objects to act like arrays

• Does not allow usage of array functions on object

• Built in methods: ksort, usort, asort, getArrayCopy

Page 14: SPL: The Missing Link in Development

SplFileInfo

• Object that returns information on Files/Folders

• isDir, isFile, isReadable, isWritable, getPerms (returns int), etc.

Example Source: http://us3.php.net/manual/en/class.splfileinfo.php

Page 15: SPL: The Missing Link in Development

SPL Interfaces

• ArrayAccess

• Iterator

• RecursiveIterator

• Countable

• SeekableIterator

• SplSubject/SplObserver

Page 16: SPL: The Missing Link in Development

Observer Pattern (SPL)

• Great for applying hooks

• Exception Handling

• User Authentication

Page 17: SPL: The Missing Link in Development

SplSubject<?phpclass ExceptionHandler implements SplSubject{ private $_observers = array(); public function attach(SplObserver $observer) { $id = spl_object_hash($observer); $this->_observers[$id] = $observer; } public function detach(SplObserver $observer) { $id = spl_object_hash($observer); unset($this->_observers[$id]); } public function notify() { foreach($this->_observers as $obs) { $obs->update($this); } } public function handle(Exception $e) { $this->exception = $e; $this->notify(); }}

Example Source: http://devzone.zend.com/article/12229

Page 18: SPL: The Missing Link in Development

SplObserverClass Mailer implements SplObserver { public function update(SplSubject $subject) { // Do something with subject object }}

// Create the ExceptionHandler$handler = new ExceptionHandler();

// Attach an Exception Logger and Mailer$handler->attach(new Mailer());

// Set ExceptionHandler::handle() as the defaultset_exception_handler(array($handler, 'handle'));

Example Source: http://devzone.zend.com/article/12229

Page 19: SPL: The Missing Link in Development

ArrayAccess

• OffsetExists - Values exists for key, returns boolean

• OffsetSet - Set value for key

• OffsetGet - Return value for key

• OffsetUnset - Remove value from array• Note that if the array is numerically indexed, a call to array_values() will be required to re-index

the array if that is the behaviour required.

Example Source: http://www.phpro.org/tutorials/Introduction-to-SPL-ArrayAccess.html

Page 20: SPL: The Missing Link in Development

ArrayAccess Example<?phpclass book implements ArrayAccess{ public $title;

public $author;

public $isbn;

public function offsetExists( $offset ) { return isset( $this->$offset ); }

public function offsetSet( $offset, $value) { $this->$offset = $value; }

public function offsetGet( $offset ) { return $this->$offset; }

public function offsetUnset( $offset ) { unset( $this->$offset ); }}

Example Source: http://www.phpro.org/tutorials/Introduction-to-SPL-ArrayAccess.html

Page 21: SPL: The Missing Link in Development

Iterator

• Provides basic iterator functionality (foreach)

• Interface requires the following methods

• current(), key(), next(), rewind(), valid()

Page 22: SPL: The Missing Link in Development

Recursive Iterator

• A foreach only goes top level, but many times you need to dig deeper

• Recursive Iterator extends Iterator and requires hasChildren() and getChildren()

Page 23: SPL: The Missing Link in Development

Countable

• Internal Counter<?phpclass loopy{ public function count() { static $count = 0; return $count++; } public function access() { $this->count(); // Method logic }}

Page 24: SPL: The Missing Link in Development

SeekableIterator• Other iterators must start at beginning of

an array, but seekable allows you to change iteration start point.

<?php

class PartyMemberIterator implements SeekableIterator{ public function seek($index) { $this->rewind(); $position = 0;

while ($position < $index && $this->valid()) { $this->next(); $position++; }

if (!$this->valid()) { throw new OutOfBoundsException('Invalid position'); } }

Example Source: http://devzone.zend.com/article/2565

Page 25: SPL: The Missing Link in Development

SPL Iterators

• ArrayIterator

• LimitIterator

• DirectoryIterator

• RecursiveDirectoryIterator

• GlobIterator

Page 26: SPL: The Missing Link in Development

ArrayIterator

• Implements: Iterator, Traversable, ArrayAccess, SeekableIterator, Countable

• Used to Iterate over ArrayObject or PHP array

Page 27: SPL: The Missing Link in Development

ArrayIterator<?php// Using While/*** create a new object ***/$object = new ArrayIterator($array);

/*** rewind to the beginning of the array ***/$object->rewind();

/*** check for valid member ***/while($object->valid()){ /*** echo the key and current value ***/ echo $object->key().' -&gt; '.$object->current().'<br />';

/*** hop to the next array member ***/ $object->next();}

// Using Foreach$object = new ArrayIterator($array);foreach($object as $key=>$value){echo $key.' => '.$value.'<br />';}

Example Source: http://www.phpro.org/tutorials/Introduction-to-SPL.html#6

Page 28: SPL: The Missing Link in Development

LimitIterator• Used similar to Limit in SQL

<?php// Show 10 files/folders starting from the 3rd.$offset = 3;

$limit = 10;

$filepath = '/var/www/vhosts/mysite/images'

$it = new LimitIterator(new DirectoryIterator($filepath), $offset, $limit);

foreach($it as $r){ // output the key and current array value echo $it->key().' -- '.$it->current().'<br />';}

Page 29: SPL: The Missing Link in Development

DirectoryIterator

• If you’re accessing the filesystem this is the iterator for you!

• Returns SplFileInfo object

Page 30: SPL: The Missing Link in Development

DirectoryIterator<?php$hdl = opendir('./'); while ($dirEntry = readdir($hdl)){ if (substr($dirEntry, 0, 1) != '.') { if(!is_file($dirEntry)) { continue; } $listing[] = $dirEntry; }}closedir($hdl);foreach($listing as $my_file){ echo $my_file.'<br />';}

<?phptry{ /*** class create new DirectoryIterator Object ***/ foreach ( new DirectoryIterator('./') as $Item ) { echo $Item.'<br />'; }}/*** if an exception is thrown, catch it here ***/catch(Exception $e){ echo 'No files Found!<br />';}

Page 31: SPL: The Missing Link in Development

RecursiveDirectory Iterator

• Move out of the top level and get all children files/folders

<?php $dir = '/Users/jsmith/Sites/vhosts/test.local/wwwroot'; $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir)); // could use CHILD_FIRST if you so wish foreach ($iterator as $file) { echo $file . "<br />"; }

Page 32: SPL: The Missing Link in Development

GlobIterator (5.3)

• Very Similar to DirectoryIterator

• Only use if you want to convert old glob code into an iterator object

• returns SplFileInfo Objects

Page 33: SPL: The Missing Link in Development

SPL Exceptions

• Logic Exception

• BadFunction

• BadMethodCall

• InvalidArgument

• OutOfRange

• RuntimeException

• OutOfBounds

• Range

• UnexpectedValue

• Underflow

Example Source: http://www.php.net/manual/en/spl.exceptions.php

Page 34: SPL: The Missing Link in Development

New SPL in PHP 5.3

Page 35: SPL: The Missing Link in Development

SplFixedArray

• Array with pre-defined dimensions

• Shows great speed for setting and retrieving

• If you change Array dimensions, it will crawl.

Page 36: SPL: The Missing Link in Development

SplHeap

• Automatically reorder after insert, based off of compare() method

• Extract is similar to array_shift()

• Great memory usage!

Example Source: http://www.slideshare.net/tobias382/new-spl-features-in-php-53

Page 37: SPL: The Missing Link in Development

SplMaxHeap

• Subclass of SplHeap

• When you extract() a value it will return in order from greatest to least

<?php$heap = new SplMaxHeap();$heap->insert('b');$heap->insert('a');$heap->insert('c');

echo $heap->extract()."\n";echo $heap->extract()."\n";echo $heap->extract()."\n";// OUTPUT:// c// b// a

Example Source: http://www.alberton.info/php_5.3_spl_data_structures.html

Page 38: SPL: The Missing Link in Development

SplMinHeap

• Subclass of SplHeap

• When you extract() a value it will return in order from least to greatest

<?php$heap = new SplMinHeap();$heap->insert('b');$heap->insert('a');$heap->insert('c');

echo $heap->extract()."\n";echo $heap->extract()."\n";echo $heap->extract()."\n"; // OUTPUT:// a// b// c

Example Source: http://www.alberton.info/php_5.3_spl_data_structures.html

Page 39: SPL: The Missing Link in Development

SplDoublyLinkedList

• Do not know size of list/array

• Can only be read sequentially

• Less processing power required, on large data sets provides better memory usage

Page 40: SPL: The Missing Link in Development

SplStack

• Method: push and pop

• LIFO

Page 41: SPL: The Missing Link in Development

SplQueue

• Methods: enqueue and dequeue

• FIFO

Page 42: SPL: The Missing Link in Development

Questions?

Page 44: SPL: The Missing Link in Development

Thanks for listening!Contact Information[t]: @jakefolio[e]: [email protected][w]: http://www.jakefolio.com[irc]: #dallasphp