Die SPL - Standard PHP Library

Flattr this
Tweet this: Die SPL - Standard PHP Library
Dent this: Die SPL - Standard PHP Library
Tags: PHP, SPL
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

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.

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/173

Es sind keine Trackbacks vorhanden.


Kommentare (1)

  • Kommentar von mikex am 24.10.2009 03:50:39
    Gravatar mikex
    hi, cool danke für die zusammenfassung! als php anfänger, bin ich froh über sowas :-)

Die Kommentare zu diesem Beitrag sind gesperrt.

You liked it ? Link it on your homepage or blog: