Zum Inhalt springen
Der Guide für ein smartes Leben.
VG Wort Pixel
Neues in PHP 5.4

PHP 5.4: Optimierte Version

Die Entwicklung der neuen PHP Version schreitet schnell voran, die Betaversion gibt es seit Ende September. Erfahren Sie mehr über die neuen Funktionen.

Autor: Andreas Hitzig • 21.2.2012 • ca. 4:35 Min

PHP 5.4: Optimierte Version
PHP 5.4: Optimierte Version
© Internet Magazin
Inhalt
  1. PHP 5.4: Optimierte Version
  2. Optimierter Array-Zugriff

Die Liste der Neuerungen in PHP 5.4 ist sehr lang geworden und umfasst neben kleineren Optimierungen auch eine Reihe von neuen Funktionen. Diese konzentrieren sich vorrangig auf die PHP-Programmierung im engeren Sinne. Die aktuellste Programmversion steht Ihnen im Qualitätssicherungsbereich von PHP...

image.jpg
Es gibt in der ersten Betaversion nach zahlreiche Bugs, die bereits öffentlich bekannt sind.
© Internet Magazin

Die Liste der Neuerungen in PHP 5.4 ist sehr lang geworden und umfasst neben kleineren Optimierungen auch eine Reihe von neuen Funktionen. Diese konzentrieren sich vorrangig auf die PHP-Programmierung im engeren Sinne. Die aktuellste Programmversion steht Ihnen im Qualitätssicherungsbereich von PHP.net zur Verfügung. Da es sich noch um eine Betaversion handelt, dient diese vorrangig dazu, erste Erfahrungen mit den neuen Funktionen zu sammeln und nicht dazu, diese direkt in einer produktiven PHP-Umgebung einzusetzen. Dafür enthält die Betaversion noch zu viele Fehler. Wenn Sie bei Ihren Tests auf Ungereimtheiten stoßen sollten, können Sie diese auch direkt an PHP melden, entweder über die QA-Mailing-Liste oder den PHP Bugtracker.

Wichtige Neuerung: Traits

Die wohl wichtigste Funktionen in PHP 5.4, denen die gesamte PHP-Fangemeinde entgegenfiebert, sind Traits. Dabei handelt es sich um einen Mechanismus zum Vererben von klassenübergreifendem Programmcode ohne vertikale Vererbung. Dies vervollständigt die mit Version 5 gestartete Vererbung innerhalb der Objektorientierung. Bis jetzt gab es allerdings nur eine einfache Vererbung (single inheritance) in vertikaler Richtung, also ein Übergang vom Eltern- auf den Kindknoten.

image.jpg
Die wesentliche Neuerung "Traits" ist innerhalb der Online-Dokumentation bereits gut beschrieben.
© Internet Magazin

Mit der Implementierung der Traits können Sie zusätzlich neue Übergruppen mit gemeinsamen Eigenschaften aus vorhandenen Klassen definieren und darauf wieder die bereits bekannte Vererbungslehre anwenden. Die neu erzeugten Unterklassen lassen sich schließlich wie gewohnt nach eigenen Bedürfnissen erweitern.Die Definition eines Traits ähnelt der einer Klasse, bietet jedoch nicht die Möglichkeit der Instanziierung. Ein Trait wird von einer Klasse benutzt und diese verhält sich so, als ob Sie die vom Trait übernommenen Eigenschaften und Methoden selbst implementieren würde. Dank dieser neuen Funktionalität müssen Sie Programmcode nur noch an einer Stelle pflegen und können auf Copy-und-Paste verzichten.Im Beispiel wird ein Trait huepfen definiert und dieser anschließend den beiden Klassen Kaenguru und Frosch zugewiesen. Diese haben in der realen Welt nichts miteinander zu tun, können sich aber trotz allem beide hüpfend fortbewegen.

trait huepfen {
public function huepf () {
$klasse = get_class($this);
echo "$klasse huepft..." . \PHP_
EOL;
}
}

Der Trait huepfen besitzt eine öffentliche Methode huepf, die im Folgenden von Klassen genutzt werden kann. Die Methode macht nichts anderes, als die aufrufende Klasse zu ermitteln und diese auszugeben.

class Kaenguru {
use huepfen;
}
class Frosch {
use huepfen {
huepf as private huepfAlias;
}
public function huepf () {
$this->huepfAlias();
echo "Ich huepfe!!!" . \
PHP_EOL;
}
}

Die Klasse Kaenguru implementiert den Trait huepfen ohne weitere Änderungen. Wenn Sie anschließend eine neue Instanz von Kaenguru erzeugen und die Methode aufrufen, erhalten Sie die Ausgabe "Kaenguru huepft..." .

$kaenguru = new Kaenguru;
$kaenguru->huepf();

Etwas anders verhält es sich mit der Klasse Frosch. Diese implementiert eine eigene Methode huepf(), innerhalb der eine alternative Ausgabe definiert wird. Interessant bei dieser Vorgehensmethode ist der Umgang mit der bereits existierenden Methode huepf(). Diese wird nicht überschrieben, denn ansonsten hätten Sie den Trait huepfen streng genommen überhaupt nicht benötigt.Für die ursprüngliche Methode huepf() wird ein Alias huepfAlias geschaffen und dessen Sichtbarkeit auf private gesetzt. Anschließend deklarieren Sie innerhalb der Klasse Frosch eine neue Methode huepf(), in der als erstes die ursprüngliche Methode und anschließend der Text "Ich hüpfe!!!" ausgegeben wird. Wenn Sie eine Instanz der Klasse Frosch anlegen und anschließend die Methode huepf() anwenden, erhalten Sie die Ausgaben beider Texte.

$meinFrosch = new frosch;
$meinFrosch->huepf();

Chaosgefahr

Der Flexibilität von Traits sind allerdings auch Grenzen gesetzt. Sie können nicht in zwei unterschiedlichen Traits die gleiche Methode direkt implementieren und in Klassen verwenden, ohne dass es zu Konflikten kommt. Als Entwickler müssen Sie dafür Sorge tragen, dass bei der Namensgebung keine Probleme vorkommen.Sollten Sie sich trotz allem dafür entscheiden, innerhalb von zwei Traits eine gleichnamige Methode zu implementieren, bleibt Ihnen eine letzte Ausnahme: Sie können diese innerhalb Klasse genau dann ansprechen, wenn eine eindeutige Zuordnung der Aufrufe möglich ist.Dazu bedarf es allerdings einer Reihe von Vorarbeiten: Als erstes müssen Sie die beteiligten Traits mit Hilfe des Befehl use einbinden. Der Aufruf der entsprechenden Methode folgt anschließend mit vorangestelltem Trait-Namen. Nur in diesem Fall ist ein eindeutiger Aufruf gesichert.

trait meinTrait1 {
public function hallo () {
echo "Hier spricht meinTrait1
!\n";
}
}
trait meinTrait2 {
public function hallo () {
echo "Ich bin meinTrait2\n";
}
}
class MeineKlasse {
use meinTrait1, meinTrait2 {
meinTrait1::hallo insteadof
meinTrait2;
meinTrait2::hallo as hallo2;
}
}

Nachdem Sie definiert haben, welche Traits innerhalb der Klasse beteiligt sind, legen Sie anschließend fest, welche der gleichnamigen Methoden final verwendet wird. Dies geschieht über die insteadof-Methode. Damit Sie auch die hallo-Methode des zweiten Traits nutzen können, weisen Sie dieser einen Alias zu. Im Beispiel erhält die hallo-Methode von meinTrait2 den temporären Namen hallo2 zugewiesen.

Weiteres Trait-Beispiel

In einem weiteren Beispiel zeigen wir Ihnen im Detail, was mit Traits noch möglich ist. Dazu definieren wir die beiden Traits Protokoll_fuehren sowie Prot_Hilfe, wobei der zweite Trait vom ersten erben soll. Im Trait Protokoll_fuehren gibt es eine nichtöffentliche Variable Protokollfuehrer sowie eine geschützte Methode protokollieren.

trait Protokoll_fuehren {
private $_Protokollfuehrer;
protected function protokollieren
($level, $nachricht) {
$x = $this->_Protokollfuehrer;
if (!is_null($x)) {
$x($level, $nachricht);
}
}
}

Der zweite Trait Prot_Hilfe nutzt über den Befehl use den Trait Protokoll_fuehren und besitzt darüber drei Methoden, die alle die Methode protokollieren() aus Protokoll_fuehren nutzen.

trait Prot_Hilfe {
use Protokoll_fuehren;
protected function hinweis
($nachricht) {
$this->protokollieren('HINWEIS',
$nachricht);
}
protected function warnung
($nachricht) {
$this->protokollieren('WARNUNG',
$nachricht);
}
protected function fehler
($nachricht) {
$this->protokollieren('FEHLER',
$nachricht);
}
}

Innerhalb der Klasse meineKlasse wird anschließend der Trait Prot_Hilfe verwendet. Wenn Sie Zugriff auf die einzelnen geschützten Methoden benötigen, müssen Sie diese explizit bei der Deklaration des Befehls angeben. Fehlt beispielsweise der Verweis auf warnung, dann kommt es in der öffentlichen Funktion uebermittleWarnung() zu einem Fehler, da die Methode warnung nicht bekannt ist.

class meineKlasse {
use Prot_Hilfe {
hinweis as protected;
fehler as protected;
warnung as protected;
}
public function __construct () {
$this->_Protokollfuehrer =
function ($level, $nachricht) {
echo "[$level] $nachricht\n";
};
}
public function uebermittleHinweis
() {
$this->hinweis ('Dies ist ein
Hinweis');
}
public function uebermittleWarnung
() {
$this->warnung ('Dies ist eine
Warnung');
}
public function uebermittleFehler
() {
$this->fehler ('Dies ist ein
Fehler');
}
}

Neben den Traits gibt es auch noch eine Reihe von weiteren interessanten Neuerungen, welche die Programmierung in PHP erleichtern.