Alle Artikel mit dem Schlagwort: PHP 5

PHP 5: Standard-Datenstrukturen nicht neu erfinden – Queues, Stacks und Co.

Problem Sie benötigen in Ihrem Programm Datenstrukturen, die PHP nicht out-of-the-box bietet (z.B. Stack, Linked-List oder Queue). Sie könnten diese  mithilfe von Arrays als eigene Klasse implementieren, sind sich aber nicht sicher, ob Sie dabei nicht unnötig das Rad neu erfinden. Lösung Seit PHP 5.3 bietet die Standard PHP Library (SPL) einige dieser Datenstrukturen an. Die Klasse SplStack implementiert eine LIFO-Datenstruktur (Last-In-First-Out) und somit eine Datenstruktur, die sich wie ein Stack (engl. für Stapel) verhält: $stack = new SplStack(); $stack->push(‘a’); $stack->push(‘b’); $stack->push(‘c’); echo $stack->pop().”\n”; echo $stack->pop().”\n”; echo $stack->pop().”\n”; c b a Die Klassen SplHeap, SplMinHeap und SplMaxHeap implementieren eine Heap-Datenstruktur.SplHeap ist dabei eine abstrakte Klasse und kann nicht direkt instantiiert werden. In einem Heap werden die einzelnen Elemente anhand ihrer Schlüsselwerte in einer Baumstruktur abgelegt. SplMinHeap und SplMaxHeap implementieren jeweils die von SplHeap als abstrakt deklarierte Funktion compare(). SplMinHeap legt die hinzugefügten Elemente in aufsteigend sortierter Reihenfolge ab, SplMaxHeap dagegen in absteigend sortierter Reihenfolge: $heap = new SplMaxHeap(); $heap->insert(‘b’); $heap->insert(‘a’); $heap->insert(‘c’); echo $heap->extract().”\n”; echo $heap->extract().”\n”; echo $heap->extract().”\n”; c b a $heap = new SplMinHeap(); $heap->insert(‘b’); …

PHP 5: Callback-Funktionen mit einem Zustandsgedächtnis programmieren

Problem Sie benötigen eine Callback-Funktion. Eine einfache Funktion (z.B. ein Closure oder eine Lambda-Funktion) reicht aber für Ihre Zwecke nicht aus, da die Callback-Funktion einen eigenen Zustand halten – also ein Zustandsgedächtnis haben – soll. Lösung Seit PHP 5.3 haben Sie die Möglichkeit, von Funktionsobjekten Gebrauch zu machen. Dabei handelt es sich um Objekte, die wie Funktionen behandelt und demnach also auch wie Funktionen aufgerufen werden können: class Funktor { public function __invoke($wert) { print $wert . “\n”; } } $f = new Funktor; $f(‘Hallo Welt!’); Hallo Welt! Diskussion In Rezept 6.12 haben Sie gesehen, wie Lambda-Funktionen verwendet werden können, um z.B. ein Array mit der Funktion usort() zu sortieren. Diese Funktionen werden oft als Callback-Funktionen oder kurz Callbacks bezeichnet. Ein solches Callback übergibt man an eine beliebige Funktion, und diese ruft es mit diversen Parameterwerten auf. Die usort()-Funktion ruft ein Callback beispielsweise mit zwei Werten auf, die miteinander verglichen werden sollen. Die Callback-Funktion ist dabei nicht in der Lage, einen Zustand über mehrere Aufrufe hinweg zu halten. Einfach formuliert, könnte man sagen, sie hat …

PHP 5: Mit Namespaces Kollisionen zwischen Klassennamen verhindern

Problem Sie nutzen in Ihrer Applikation diverse Bibliotheken oder Frameworks und wollen Konflikte zwischen eigenen Klassen und Framework-Klassen mit identischen Namen vermeiden. Sie möchten dabei aber nicht den in PHP häufig angewandten Kompromiss eingehen und den Klassennamen verkomplizieren (z.B. MeinProjekt_MeineTeilanwendung_Meine-Klasse). Lösung Durch die Verwendung von Namespaces, die ab PHP 5.3 zur Verfügung stehen, können Sie eine saubere Trennung der Namensräume erreichen, ohne den Klassennamen künstlich zu verkomplizieren. Das folgende Codebeispiel zeigt, wie das aussehen könnte: namespace net\php\pear\Date { class DateTime { public function __construct() { print __CLASS__ . ” created\n”; } } } namespace de\oreilly\phpckbk { class DateTime { public function __construct() { print __CLASS__ . ” created\n”; } } $oreillyDateTime      = new DateTime(); use net\php\pear\Date; $pearDateTime         = new Date\DateTime(); $phpDateTime          = new \DateTime(); print_r($phpDateTime); } Wie Sie sehen, werden im gezeigten Codebeispiel drei Klassen mit identischem Namen (DateTime) verwendet. Wir selbst bewegen uns im Namensraum de\oreilly\phpckbk und haben dort die Klasse DateTime definiert. Diese kann also ohne weitere Namensraumangabe instantiiert werden. Durch Angeben des entsprechenden Namensraums können wir genauso einfach …