Ich muss zu meiner Schande gestehen, dass ich seit November gar nicht mehr verfolgt habe, was so vor sich geht. Da wurden erste Specs bekannt, und die objektorientierten Erweiterungen waren konzeptionell unausgegoren und krankten zudem an der Performance, und das, obwohl man Anfang 2003 eine erste Version zeigen wollte.
Beweist dies aber auch, dass man eine Sache nicht zu früh abschreiben sollte, denn nachdem ich heute die neue Engine schonmal auf die neuen Features getestet habe, war ich mehr als angenehm überrascht.
Kurz, was neu ist:
- die Objektorientierung ist stark erweitert (Details siehe: http://www.php.net/zend-engine-2.php)
- libxml2 ist jetzt fest integriert
- SQLite ist fest integriert worden
und diverse andere Verbesserungen, php.net nennt hier explizit das Streaming-Verhalten
Wer's schonmal ausprobieren will: das Teil ist noch buggy wie Sau!
Zumindest konnte ich es unter Windows schonmal als CLI und CGI laufen lassen, musste dazu aber iconv.dll wohin kopieren, wo Windows sie sicher findet (im dlls-Ordner wollte das nicht wie bei PHP4 anspringen), ausserdem stiften die zu PHP4 gleichen Namen der Dateien noch Verwirrung (php4ts.dll etc.). Als Apache-Modul crashte das ganze noch ordentlich. Unter Linux hab ich es noch nicht getestet, kommt aber noch.
Ich hab mich dann gleich dran gemacht und kleine Beispielklassen gecodet, um zu sehen, was es taugt. Wie man hier sieht,
sind die Änderungen enorm:
$this->bbcode_second_pass_code('', '<?php
interface Wachstum {
abstract public function altern();
}
abstract class Humanoide implements Wachstum {
protected $alter = 0;
protected $geschlecht;
abstract public function altern();
public final function getAlter() {
return $this->alter;
}
}
class Mensch extends Humanoide {
protected static $vorfahre = "Affe";
protected $name;
function __construct($name, $geschlecht) {
$this->name = $name;
$this->geschlecht = $geschlecht;
$this->altern();
}
function __destruct() {
echo "\n...und so scheidet ".$this->name." dahin";
}
final function altern() {
$this->alter++;
}
final function getName() {
return $this->name;
}
function umbenennen($neuerName) {
$this->name = $neuerName;
}
function geburtstagFeiern() {
$this->altern();
echo "trööööt";
}
public static final function neueEvolutionstheorie($neuerVorfahre) {
Mensch::$vorfahre = $neuerVorfahre;
}
public static final function getVorfahre() {
return Mensch::$vorfahre;
}
}
class Deutscher extends Mensch {
function __construct($name, $geschlecht) {
parent::__construct($name, $geschlecht);
}
function umbenennen($neuerName, $geduldsfaden=false) {
$erfolg = $this->behoerdengang($geduldsfaden);
if ($erfolg) $this->name = $neuerName;
}
private function behoerdengang($geduldsfaden) {
try {
if (!$geduldsfaden)
throw new Exception("Diese Behörden: ARRRGGGHHH!");
return true;
} catch (Exception $e) {
echo $e->getMessage()."
";
return false;
}
}
}
$ich = new Mensch("Christoph", "m");
echo $ich->getName()."
";
$ich->umbenennen("Guru");
echo "neuer Name: ".$ich->getName()."
";
// echo $ich->geschlecht; // protected! erzeugt Fehler!
if ($ich instanceof Mensch) echo $ich->getName()." ist ein Mensch!
";
Mensch::neueEvolutionstheorie("Hirsch");
echo "Der Mensch ist ein Nachfahre von ".Mensch::getVorfahre()."
";
$du = new Deutscher("Tom", "m");
// $du->behoerdengang(true); // Methode ist private!!!
$du->umbenennen("Hans", false); // wirft die Exception aus
?>')
Hier werden schonmal die allermeisten neuen Techniken der Objektorientierung dargestellt (Zugriffsspezifizierer, abstrakte Klassen, statische Membervariablen/Methoden, Interfaces, Konstruktorverkettung, Destruktoren, Exceptions und der instanceof-Operator).
Eigentlich schon abgedroschen ist die Feststellung, dass hier Java-Fans am Werke waren. Aber auch Anlehnungen an Python sehe ich, bei der Operatorüberladung (__get(), __set() etc.). Das Einbinden der XML-Bibliotheken ist auf jeden Fall zukunftsweisend, hat hier gerade Java schon gezeigt, wo's hier künftig langgeht: in der Standarddistribution schon mit drin. Befremdlich finde ich das Fehlen des mitgelieferten MySQL-Treibers. Gerade unter Windows mach sich das Fehlen der dll bemerkbar, da man hier nicht so flott mit eigenstädnigem Kompilieren ist. Hier wird aber wohl noch nachgebessert.
Eine Bewertung kann hier nicht ausbleiben. Es war in letzter Zeit in einschlägigen Communities von "PHP5-Panik" die Rede. Tatsächlich ist gerade die neue Klassenimplementierung ein großer Sprung nach vorne. Bezeichnend aber, was die PHP-Entwickler selbst zur "Zend-Engine-2" sagen:
Many PHP programmers aren't even aware of the copying quirks of the old object model and, therefore, the majority of PHP applications will work out of the box, or with very few modifications.
Gerade da PHP eine absolute Anfängersprache ist und sehr leicht zu erlernen, werden nur ganz wenige der PHP-Programmierer die neuen Möglichkeiten auch zu nutzen wissen. Leider, das muss man sagen, ist der ganz große Teil der Skripter ziemlich schlecht (auch wenn's an Prahlereien nicht fehlt...), und so befürchte ich, dass die Kluft zwischen guten Programme und schlechten Programmen künftig noch größer ausfällt und man wirklich gut designte Programme regelrecht suchen muss. Dennoch: es war einfach notwendig, hier nachzulegen, denn die fehlenden Möglichkeiten der OOP waren bis jetzt immer Anlaß zur Kritik. Fortgeschrittene und Profis haben jetzt endlich die Möglichkeit, ein sauberes, objektorientiertes Design aufzusetzen, das auch höheren Ansprüchen genügt und die Wiederverwertung von Code ähnlich einfach macht wie bei Java. Bei diesen wird, da bin ich mir sicher, PHP stark an Beliebtheit zulegen. Wie dies bei der großen Masse ankommt, wird sich noch zeigen. Die "Panik" lässt zunächst nichts gutes vermuten, allerdings sollte man nicht vergessen, dass man auch jetzt noch prozedural programmieren kann und die bisherigen Klassen (die freilich nicht mehr Code-Verschönerung waren im Vgl. zu Funktionen) übernehmen kann. Als schön kann man dies dann freilich nicht mehr bezeichnen.
Mein persönliches Fazit:
ich konnte schon fast kein PHP4 mehr sehen, weil es so unglaublich spärlich war und kaum Raum für gutes Quelltext-Design ließ. Von PHP5 hätte ich einen solchen Sprung nicht erwartet, und ich bin absolut begeistert! Eins weiß ich: wenn die 5er-Version mal einigermaßen stabil läuft, würdige ich die Vorgängerversionen keines Blickes mehr. Ich geh jetzt schon mal langsam daran, meine bisherigen Bibliotheken für die 5er aufzumotzen.