Die SPL - Standard PHP Library
Datum: 29.09.2009 16:09:23
Seit nun 5 Jahren (seit Version 5.0 von PHP) gibt es die SPL - Standard PHP Library.
Die an C++'s STL - Standard Template Library angelehnte Extension hatte ihren Ursprung vor 6 Jahren in der
PECL - PHP Extension Community Library und wurde in PHP 5 direkt zu einer Core-Komponente die für mich heute kaum noch wegzudenken ist.
Mit der SPL kamen vordefinierte Interfaces wie Countable, IteratorAggregate und Serializable, die wirklich vielen interessanten Iteratoren, die Klassen SplFileInfo und SplFileObject,
ArrayAccess, das es einem endlich ermöglichte eigene Container zu schreiben die den Array-Operator ([]) nutzen und mit PHP 5.3 auch noch ein paar neue Datenstrukturen.
Inhaltsverzeichnis
- Exceptions
- Iteratoren
- Vordefinierte Interfaces
- Datenstrukturen
- Observer
- Funktionen
- SPL-Codeschnipsel
- Weiterführende Informationen
- Fazit
Exceptions
Die SPL bringt zusätzlich zu der auch seit PHP 5 vorhandenen Standard-Exception einen Satz an weiteren Exceptions für verschiedene Fälle mit die man benutzen kann oder auch darauf seine eigenen Exceptions aufbauen kann. Die Exceptions selbst bieten keinerlei zusätzliche Funktionalität sondern erben nur von der Standard-Exception, sollen aber durch ihre Namen zur Verbesserung der Codequalität beitragen und eine Hilfe beim Debuggen bieten. Ihre Namen ähneln denen aus aus anderen Sprachen wie Java oder C++.
- BadFunctionCallException
- BadMethodCallException
- DomainException
- InvalidArgumentException
- LengthException
- LogicException
- OutOfBoundsException
- OutOfRangeException
- OverflowException
- RangeException
- RuntimeException
- UnderflowException
- UnexpectedValueException
Iteratoren
- AppendIterator (seit PHP 5.1)
- ArrayIterator (seit PHP 5.0)
- CachingIterator (seit PHP 5.0)
- DirectoryIterator (seit PHP 5.0)
- EmptyIterator (seit PHP 5.1)
- FilterIterator (seit PHP 5.0)
- GlobIterator (seit PHP 5.3)
- InfiniteIterator (seit PHP 5.1)
- IteratorIterator (seit PHP 5.1)
- LimitIterator (seit PHP 5.0)
- MultipleIterator (seit PHP 5.3)
- NoRewindIterator (seit PHP 5.1)
- ParentIterator (seit PHP 5.1)
- RecursiveArrayIterator (seit PHP 5.1)
- RecursiveCachingIterator (seit PHP 5.1)
- RecursiveDirectoryIterator (seit PHP 5.0)
- RecursiveFilterIterator (seit PHP 5.1)
- RecursiveFilesystemIterator (seit PHP 5.3)
- RecursiveIteratorIterator (seit PHP 5.0)
- RecursiveTreeIterator (seit PHP 5.3)
- RecursiveRegexIterator (seit PHP 5.1)
- RegexIterator (seit PHP 5.1)
- SimpleXMLIterator (seit PHP 5.0)
Die Iteratoren haben wohl bei mir persönlich das größte Interesse geweckt, die Möglichkeiten mit dem DirectoryIterator oder dem RecursiveDirectoryIterator Verzeichnis-Strukturen
vernünftig iterieren zu können anstatt umständlich mit glob() oder open/read/closedir() zu arbeiten, kombiniert mit eigenen FilterIterator und SortIterator lässt sich damit sehr
komfortabel arbeiten.
Das SplFileInfo-Objekt erlaubt es beim Traversieren der Verzeichnis-Iteratoren dann auch sehr komfortabel auf alle relevanten Informationen des Elements zuzugreifen und mittels dem
SplFileObject lässt sich über die einzelnen Zeilen einer Datei iterieren
Vordefinierte Interfaces
Die vordefinierten Interfaces wie Countable, Serializeable, Iterator, IteratorAggregate, RecursiveIterator, Seekableiterator und ArrayAccess spielen eine ganz besondere Rolle, weil sie im Gegensatz zu selbst definierten Interfaces direkt in C geschrieben sind und im Hintergrund die Verknüpfung mit nativen PHP-Funktionen und Sprachkonstrukten (count(), serialize(), foreach()) ermöglichen oder Klassen die das Interface implementieren um Operatoren ([]) erweitern.
Datenstrukturen
Seit PHP 5.3 sind auch einige Klassen dazugekommen die dynamische und Geschwindigkeits/Speicherverbrauch-optimierte Datenstrukturen zur Verfügung stellen.Dazu gehören:
- SplDoublyLinkedList
- SplStack
- SplQueue
- SplHeap
- SplMaxHeap
- SplMinHeap
- SplPriorityQueue
- SplFixedArray
- SplObjectStorage
Eine nette Presentation mit ein paar Benchmarks zu diesen Datenstrukturen von Matthew Turland findet man bei Slideshare: New SPL Features in PHP 5.4
Observer
Mit den Interfaces SplObserver und SplSubject stellt die SPL seit PHP 5.1 auch fertige Beispiel-Interfaces für das Observer-Pattern zur Verfügung. Zur Implementierung des Observers bietet sich dann gleich die neue SplObjectStorage-Klasse an.
Funktionen
Auch wenn die SPL eigentlich eine wachsende Sammlung von (abstrakten) Klassen und Interfaces ist, haben sich auch ein paar Funktionen dazugesellt.- class_implements - Gibt die implementierten Interfaces einer Klasse zurück
- class_parents - Gibt die Elternklassen eines Objekts zurück
- iterator_apply - Wendet eine Callback-Funktion auf alle Elemente eines Interators an (wie array_walk für Arrays)
- iterator_count - Zählt die Anzahl der Elemente eines Iterators
- iterator_to_array - Wandelt einen Iterator in ein Array mit Elementen um
- spl_autoload_call - Funktion zum laden einer Klasse mit den vorhandenen Autoload-Funktionen
- spl_autoload_extensions - Gibt die verwendeten Dateiendungen für die Autoload-Funktion zurück
- spl_autoload_functions - Gibt alle vorhandenen Autoload-Funktionen zurück
- spl_autoload_register - Hinzufügen von Autoload-Funktionen
- spl_autoload_unregister - Entfernen von Autoload-Funktionen
- spl_autoload - Implementierung für die autoload-Funktion
- spl_classes - Gibt ein Array mit allen in der aktuellen Version zur Verfügung gestellten SPL-Klassen zurück
- spl_object_hash - Gibt einen eindeutigen Hash für das Objekt zurück
Sehr interessant sind die spl_autoload_*-Funktionen die in den Autoloadern der meisten Frameworks und Bibliotheken genutzt werden, damit lassen sich sehr schöne Regeln zum
automatischen Laden (Lazy Load) von Klassen und Interfaces erstellen damit nur Klassen geladen werden die auch wirklich gebraucht werden, aber jeder gleichzeitig frei ist das Mapping
zwischen Klassenname und Dateinamen selbst zu bestimmen.
So lassen sich auch verschiedene Frameworks und Bibliothken mit Autoloading zusammen nutzen. Was man schön am Autoloader des Zend Frameworks
sieht.
SPL-Codeschnipsel
Auch ich habe ein paar Codeschnipsel auf meiner Seite die Klassen und Interfaces der SPL nutzen, insbesondere DirectoryIterator, RecursiveDirectoryIterator und SplFileInfo.
- Verzeichnisse (rekursiv) auslesen mit den Iteratoren der SPL
- Ordnergröße, Anzahl Dateien, Ordner und Symlinks mit PHP und der RecursiveDirectoryIterator auszulesen
- Zip-Archiv von einem Ordner mit PHP erstellen und entpacken
- Verschachtelte XML-Dateiliste eines Ordner über den RecursiveDirectoryIterator und DOM erstellen
- Lineare XML-Dateiliste eines Ordner über den RecursiveDirectoryIterator und DOM erstellen
- CSV-Dateiliste eines Ordners erstellen
- TXT-Dateiliste eines Ordners erstellen
- Alle Bilder (jpg, jpeg, png, gif) aus einem Verzeichnis mit PHP und dem RegexIterator herausfiltern
- Größen und Dateityp gefilterte Dateiliste mit dem RecursiveDirectoryIterator, dem RegexIterator und einem eigenen FilterIterator (SizeFilterIterator)
Weiterführende Informationen
Meiner Meinung nach die beste und aktuellste API-Übersicht über die SPL von Marcus "helly" Börger findet man hier auf php.net: http://www.php.net/~helly/php/ext/spl/.
Zu beachten ist, dass es dort auch Iteratoren, Interfaces und Klassen gibt die es noch nicht in ein Releases der SPL geschafft haben, manche sind noch in der Entwicklung und werden wohl in späteren Releases von PHP 5.3 zur Verfügung stehen.
Ansonsten gibt es natürlich auch im PHP-Manual ein paar Seiten über die SPL, diese sind allerdings meistens nicht auf dem neuesten Stand.
Das Buch Professionelle Softwareentwicklung mit PHP 5 von Sebastian Bergmann (Programmierer von PHPUnit) bietet neben anderem auch einen guten Einstieg in die SPL mit ein paar Code-Beispielen. Das Buch gibt es kostenlos zum online lesen unter http://professionelle-softwareentwicklung-mit-php5.de/ oder bei Amazon: Professionelle Softwareentwicklung mit PHP 5: Objektorientierung, Entwurfsmuster, Modellierung und fortgeschrittene Datenbankprogrammierung
Fazit
Obwohl die SPL einiges zu bieten hat, sie auch schon in einigen Frameworks (wie dem Zend Framework oder Symfony) zum Einsatz kommt, wird sie leider von vielen PHP-Programmierer nicht genutzt, was meiner Meinung nach am stärksten an ihrem geringen Bekanntheitsgrad liegt und auch etwas an der Dokumentation (und den Übersetzungen) im PHP-Manual die meistens sehr stark hinter der wirklichen Entwicklung hinterherhinken. Trotzdem kann ich jedem Programmierer der mit PHP 5 oder sogar 5.3 arbeitet nur empfehlen sich diese Extension mal genauer anzuschauen. Ich werde versuchen in der nächsten Zeit noch ein paar mehr Codeschnipsel und vielleicht kleine Artikel zur SPL zu verfassen um die Möglichkeiten die sich insbesondere durch die Iteratoren ergeben aufzeigen.
Trackbacks (0)
Trackbackurl: http://www.robo47.net/trackback/blogentry/173Es sind keine Trackbacks vorhanden.
You liked it ? Link it on your homepage or blog:



Benjamin Steininger ist Webentwickler auf der Suche nach einem neuen Job und
photographiert sehr gerne. Er beschäftigt sich viel mit dem Internet, PHP, Symfony, Testing und hat einen
Kommentare (1)
Die Kommentare zu diesem Beitrag sind gesperrt.