The document discusses the Standard PHP Library (SPL) which provides common data structures and interfaces in PHP. It describes various iterator interfaces and classes that can be used to iterate over data in a consistent manner. These include interfaces like Iterator and classes like RecursiveIteratorIterator, FilterIterator, ArrayIterator, DirectoryIterator, and SplFileInfo. It also discusses other SPL components like exceptions, autoloading functions, and data structures.
2. Community Heckling
On twitter #tek09 (or #phptek) and #spldg
DG’s for drinking game (you’ll see why later)
IRC is open, I can see backlog – constructive criticism
is good
Comment on http://joind.in/talk/view/186
No comments on hair, clothes, or my fat belly –
constructive criticism is welcome ;)
3. I have a Problem
Recursively iterate through
directories
Find all .jpg files
Check last modified dates
Moved the ones older than two
years to new location
4. How should I do this?
Some nasty recursive use of scandir() to get my lists
Or PHP’s dir() function and looping
array_map() with a convoluted callback
I think I’m going to need a lot of code….
5.
6. SPL to the Rescue!
RecursiveDirectoryIterator
RecursiveIteratorIterator
FilterIterator
SplFileInfo
What fun tools we have!
9. What is SPL?
tandard HP ibrary
A library of standard interfaces,
classes, and functions designed to
solve common programming
problems and allow engine
overloading.
10. That’s nice… in English please.
What is SPL?
1. Engine overloading hooks via interfaces
ArrayAccess, Countable, SeekableIterator
2. Classes that utilize the interfaces do cool things
ArrayObject, RecursiveIterator, DirectoryIterator
3. Standard Class Implementations
Exceptions, SplObserver and SplStorage
4. Functions to help with autoloading and objects
spl_autoload_register(), spl_classes(), iterator_apply()
11. But… it’s an extension right?
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 without altering
source
If you don’t have SPL, whoever built your PHP is an idiot
(or an evil genius – it’s HARD).
13. Autoload Magic
spl_autoload() – default autoload implementation
spl_autoload_register() – add an autoload to the stack
spl_autoload_unregister() – remove an autoloader
spl_autoload_functions() – what’s on the stack
spl_autoload_extensions() – ext for spl_autoload()
spl_autoload_call() – load something through the
stack
14. Isn’t __autoload good enough?
Combining different libraries with different naming
conventions
Dealing with different types of files (templates,
classes) in different locations
Changing autoload in use during runtime
15. Object Helper Functions
class_implements()
class_parents()
spl_object_hash()
Why are these not in core?
I DON’T KNOW - GO ASK YOUR DAD!
18. Exception Classes
RuntimeException
OutofBoundsExce OverflowExceptio UnderflowExcepti UnexpectedValueE
RangeException
ption n on xception
19. So what does SPL offer?
A standard set of Exceptions that all inherit from
PHP’s Exception base class
A standard way to set up exceptions by what kind they
are
Do I recommend it? Depends on how exceptions are
used in your application.
21. The iterator drinking game!
Every time someone says the word iterator tonight,
take a drink
Start a conversation with me, and you’ll be gone in
about five minutes
It’s the SPL drinking game (tonight at cocktail hour)
22. Iterators
What the heck is an iterator?
A design pattern that is a generic solution to the
problem of iterating over data in a consistent manner.
Access the elements of an aggregate object sequentially
without exposing its underlying representation.
Why do I care?
Ever need to go over a list of items returned from a
database (well, duh)
Or need to go over a list of items returned from a
webservice?
Ever used foreach?
23. Foreach it baby!
Foreach is your friend
iterators give your code consistent usage
and you can add more functionality
What else can you do with iterators?
Extend Iterators to do what you need
Chain Iterators: iteratoriteratoriteratoriterator
(that’s 5 shots)….
25. So how is it different?
Array $ar= array(); Iterator $it = new Iterator;
can be rewound Might be rewindable
reset($ar) $it->rewind()
is valid unless the key is NULL should know if there is a value
!is_null(key($ar)) $it->valid()
Has a current value Might have a current value or
current($ar) key
Has keys $it->key()
key($ar) $it->current()
can move forward Can move forward
next($ar) $it->next()
28. Innie or an Outie?
OuterIterator (interface)
Extends Iterator
Puts a wrapper around an iterator
inside
Has one additional method –
getInnerIterator() that should be
implemented
29. Loopety Loop
RecursiveIterator
(interface)
Has two additional
methods to implement
getChildren should
return the sub-iterator
for the current element
– and it must return an
object that implements
recursiveIterator
hasChildren
30. Jumping ahead?
SeekableIterator
(interface)
Additional method –
seek(string $position)
Lets you jump to a
specific spot to start
iterating
31. Now on to classes
Classes implement interfaces plus provide additional
functionality
Interfaces need you to fill in all the the required
methods
You can implement multiple interfaces
You can’t extend multiple classes
Choose Wisely
32. FilterIterator
Abstract Class
Has one method that must be implemented – accept –
which should return true or false
File filtering example at the beginning used this
Highly useful for many types of iteration
FilterIterator OuterIterator Iterator Traversable
34. ArrayIterator
Regular Class
Iterates an array – OR the public properties of an
object! (neat trick – dirty trick)
ArrayAccess and
ArrayIterator SeekableIterator Iterator Traversable
Countable too!
35. RecursiveIteratorIterator
Regular Class
Like IteratorIterator only recursive to boot – still not
kidding - but I don’t say it as cool as Marcus
RecursiveIteratorIterator OuterIterator Iterator Traversable
37. LimitIterator
Regular Class
Like mysql’s limit – pick your range and offset and
foreach away!
LimitIterator OuterIterator Iterator Traversable
38. CachingIterator
Regular Class
Manages another iterator by checking whether it has
more elements each time using a hasNext() method
CachingIterator OuterIterator Iterator Traversable
39. RecursiveCachingIterator
Regular Class
Just like caching iterator only – believe it or not –
recursive!
RecursiveCachingIterator CachingIterator OuterIterator Iterator Traversable
40. DirectoryIterator
Regular Class
Makes going through directories a snap
isDot, isFile – I love you
SplFileInfo
DirectoryIterator Iterator Traversable
(extends)
42. Iterator Helper Functions
iterator_apply() – like array_walk for your iterator
implementing objects
iterator_count() – count the items in your iterator (not
quite the same as implementing countable::count)
iterator_to_array() – copy all the stuff from your
iterator into a regular PHP array
Even Superman
doesn’t work alone
45. ArrayObject
A class, NOT an interface
It’s like arrayaccess on RedBull
The manual LIES – for a full list of everything you can
do with arrayobject, see
http://www.php.net/~helly/php/ext/spl/
Highlights
exchangeArray
getArrayCopy (get your internally stored array)
Sorting methods
ksort et al
46. Countable
Interface you can
implement with any
class (not iterator
specific, but used a lot
for it)
Implement the count
method and you can use
the count() PHP
function on any object
47. SplObjectStorage
This does not do what you think it does
Use objects as array keys, uniquely, with no collision
issues (you might get them from spl_object_hash)
Remember you need the object to get the data back
out, unless you’re simply iterating over the contents
Regular class, no need to extend and fill in methods
http://www.colder.ch/news/01-08-
2009/34/splobjectstorage-for-a-fa.html
48. SPLFixedArray
A fixed length, int key only array
Why? It’s FAST (very fast) because it stores data
differently “under the hood” in C
Regular class, don’t need to extend and fill in any
methods
5.3+
49. SplObserver and SplSubject
Abstract classes for anything using an observer pattern
http://www.a-scripts.com/object-oriented-
php/2009/02/21/the-observer-pattern/ - great
common sense tutorial
If you do event/observers in your code, extending
these two makes good sense
50. SplFileInfo
fancy class for a file
all the file system functions in compact object form
getMTime == filemtime
openFile == fopen
54. The Documentation Problem
http://elizabethmariesmith.com/2009/02/setting-up-
phd-on-windows/ - you can write docbook on any
platform!
Efnet - #php.doc channel
http://doc.php.net
phpdoc@lists.php.net – mailing list
See me and start helping today!
55. Resources
http://php.net/spl - spl docs
http://php.net/~helly/php/ext/spl - Doxygen docs
http://blueparabola.com/blog/spl-deserves-some-
reiteration - some stuff about new data structures
auroraeosrose@php.net