background preloader

Practical PHP Programming

Practical PHP Programming

Nested Sets - Arne Klempert Während meiner zeitweise recht intensiven Beschäftigung mit PHP bin ich irgendwann mal über das Nested-Sets-Konzept gestolpert, eine faszinierende Methode zur Abbildung von hierarchischen Strukturen in einer relationalen Datenbank. Ein Ergebnis meiner Auseinandersetzung damit war der folgende Fachartikel für das PHP-Magazin. Nested Sets – Verschachtelte Bäume mit MySQL von Arne Klempert Jeder Programmierer steht früher oder später vor der Aufgabe, Baumstrukturen in einer Datenbank abbilden zu müssen - sei es für ein hierarchisches Diskussionsforum, die Navigation einer Website oder zur Abbildung einer Ordner- und Dateistruktur. Von den ungezählten Möglichkeiten, Baumstrukturen in SQL-Datenbanken abzubilden (ein Vergleich verschiedener Ansätze findet sich in Ausgabe 2.2002) ist das Nested Sets-Modell sicher eines der interessantesten. "Nested Sets" bedeutet wörtlich übersetzt "Verschachtelte Mengen". Abbildung 1: Mengendarstellung Abbildung 2: Hierarchische Darstellung Blick auf Teilbäume

Interface - php bar Aus php bar Mit einem (dt. Schnittstelle) kann man definieren, welche Methoden eine Klasse haben muss. Dies ist vergleichbar mit der Vererbung von Klassen, mit dem Unterschied, dass das Interface keine Eigenschaften besitzt, sondern nur die Methodenköpfe enthält, die dann von der neuen Klasse überschrieben werden müssen. Allerdings ist es möglich Konstanten zu definieren, die den Klassen, die das Interface implementieren, zur Verfügung stehen. Die Konstanten sind über den Scope Resolution Operator erreichbar. Ein Interface ist ähnlich einer abstrakten Klasse, welche nur abstrakte Methoden beinhaltet. Nützlich ist dies, wenn man mehrere Klassen schreibt, die man alle zu einer Kategorie bzw. einer Funktionalität zusammenlegen kann. 1 interface logger { 2 public function open ( ) ; 3 public function write ( $msg ) ; 4 public function close ( ) ; 5 } Dieses Interface kann man nun mit dem Schlüsselwort implements in einer Klasse einbinden lassen.

Interfaces I was wondering if implementing interfaces will take into account inheritance. That is, can inherited methods be used to follow an interface's structure? <?php interface Auxiliary_Platform { public function Weapon (); public function Health (); public function Shields (); class T805 implements Auxiliary_Platform { public function Weapon () { var_dump ( __CLASS__ ); public function Health () { var_dump ( __CLASS__ . "::" . public function Shields () { var_dump ( __CLASS__ . "->" . class T806 extends T805 implements Auxiliary_Platform { $T805 = new T805 (); $T805 -> Weapon (); $T805 -> Health (); $T805 -> Shields (); echo "<hr />" ; $T806 = new T806 (); $T806 -> Weapon (); $T806 -> Health (); $T806 -> Shields (); Class T805 implements the interface Auxiliary_Platform. If the code were to be the same, but instead T805 (or T806) DOES NOT implement Auxiliary_Platform, then it'll still work. This seems to work in PHP5.2.9-2, PHP5.3 and PHP5.3.1 (my current versions). We could also do the opposite: class T805 {

Codeoptimierung:Wächter - PHP.de Wiki Das alternative Wächterprinzip macht sich die Logik zunutze, dass eine nicht erfüllte Bedingung 1 ja zwangsläufig zur Ausführung des zweiten Blocks führt. Also Wenn Bedingung 1: Führe Block 1 aus Verlasse die Bedingungsprüfung Führe Block 2 aus Beispiel 1 Im Vergleich: Ein Wertebereich soll durchlaufen werden und für alle enthaltenen Datensätze angeben, on sie 1 sind oder nicht. Pseudocode: Bsp. 1, klassischer Ansatz, Pseudocode Schleifendurchlauf Ist Wert = 1: Schreibe "key ist 1" Sonst: Schreibe "key ist ungleich 1" Bsp. 1, alternativer Ansatz, Pseudocode Schleifendurchlauf Ist Wert = 1: Schreibe "key ist 1" nächstes Schleifenelement Schreibe "key ist ungleich 1" Bsp. 1, klassischer Ansatz, PHP Umsetzung foreach ( $array as $key => $value ) { // positiver Bedingungszweig if ( $value == 1 ) { echo $key . ' ist 1<br>' ; } // negativer Bedingungszweig else { echo $key . ' ist ungleich 1<br>' ; } } Bsp. 1, alternativer Ansatz, PHP Umsetzung Beispiel 2 Bsp. 2, klassischer Ansatz, Pseudocode

SplClassLoader implementation <?php * This software consists of voluntary contributions made by many individuals * and is licensed under the MIT license. For more information, see * < * SplClassLoader implementation that implements the technical interoperability * standards for PHP 5.3 namespaces and class names. * * // Example which loads classes for the Doctrine Common package in the * // Doctrine\Common namespace. * $classLoader = new SplClassLoader('Doctrine\Common', '/path/to/doctrine'); * $classLoader->register(); * @license MIT License * @author Jonathan H. * @author Roman S. * @author Matthew Weier O'Phinney <matthew@zend.com> * @author Kris Wallsmith <kris.wallsmith@gmail.com> * @author Fabien Potencier <fabien.potencier@symfony-project.org> class SplClassLoader private $_fileExtension = '.php'; private $_namespace; private $_includePath; * specified namespace. if (false !

Ralph Schindler - Autoloading (Revisited) Upon the arrival of PHP 5.0, the ability to autoload classes was introduced. At the time, autoloading was such a new feature, it was hardly adopted. As such, many applications being ported from PHP4 to PHP5 still had lots of procedural code in them (code incapable of being be autoloaded) and many class files which had long ‘ require_once ‘ lists. It wasn’t until years later that certain best practices had emerged and the prolific usage of require_once/include_once throughout large bodies of code had started drying up. Even after autoloading had been adopted by larger more visible projects, a common patten had yet to emerge. As time has passed, slowly, more and more projects had gone through re-writes and the strategy that most projects were landing on was the one that came from the PEAR group. What We’ve Learned disk based class name to filesystem location maps are the fastest lookups class filesystem paths that are absolute and that do not rely on include_path are fastest src/ VendorName/

Welcome to the POLDOC PDDMS

Related: