de.comp.lang.php.* FAQ

2.6. Was ist neu in PHP4?

Antwort von Kristian Köhntopp

PHP4 besteht aus dem Sprachkern Zend und den Funktionsmodulen, die den eigentlichen Wert von PHP ausmachen.

Änderungen am Sprachkern:

PHP4 ist ein Interpiler

PHP3 war eine interpretierte Sprache. Code wurde nur minimal gecached. Das hatte zur Folge, dass Code in Schleifen oder in oft aufgerufenen Funktionen wieder und wieder neu geparsed werden musste, bevor er ausgeführt werden konnte.

PHP4/Zend ist ein Bytecode-Compiler, der beim Programmstart aufgerufen wird und das komplette Programm in eine interne Darstellung einer virtuellen Maschine überführt. Danach beginnt die Interpretation des Bytecodes der VM. Dies ist dasselbe Funktionsprinzip wie bei Perl, und ganz ähnlich dem Funktionsprinzip von Java, nur dass dort der Compiler explizit aufgerufen werden muss.

PHP4/Zend ist bei einigen Sprachkonstrukten zehnmal schneller als PHP3. Es liegt in den meisten Anwendungen gleichauf mit Perl oder mit Microsoft Visual Basic.

PHP4 ist threadsafe

PHP4 kann endlich in Multithreaded-Umgebungen eingesetzt werden. Dadurch wird es möglich, PHP4 als Modul im Roxen Webserver, im Internet Information Server, im AOL/Netscape-Server und in einigen anderen Webservern einzusetzen.

PHP4 kann außerdem als CGI-Programm und als Coprozess zum Webserver eingesetzt werden, der als Java Servlet Engine behandelt wird.

Referenzen sind endlich Teil der Sprache

In PHP3 waren Referenzen nur beim Aufruf von Funktionen verwendbar, um Call-by-Reference zu realisieren. In PHP4/Zend gibt es nun endlich vollständigen Support für Referenzen. Das bedeutet:

$foo = &$a;

In diesem Beispiel wird $foo zu einem alternativen Namen für die Variable $a. Dies funktioniert auch mit Arrays und Objekten.

Referenzzähler und Ressourcenfreigabe

In PHP3 existierten keine Zähler für Datenobjekte außerhalb der Sprache, etwa Image-Handles oder Datenbank-Resultathandles. Diese Ressourcen mussten manuell freigegeben werden.

PHP4/Zend hat für alle Variablen vom Typ Ressource Referenzzähler. Objekte, die nicht mehr referenziert werden, werden automatisch freigegeben. Das bedeutet: Aufrufe zu Funktionen wie mysql_free_result() innerhalb von Schleifen sind nicht mehr zwingend notwendig.

Demnach tut unset() jetzt auch endlich, was es soll.

Session-Support

PHP4 enthält Sessions nach dem Vorbild von PHPLIB als eingebauter Bestandteil der Sprache. Sessions werden standardmäßig als Dateien in einem Verzeichnis abgelegt, aber über Sessionmodule kann auch eine Datenbank, ein Shared Memory Segment oder ein anderer persistenter Speicher verwendet werden.

Anders als PHPLIB kann PHP4 die Session-ID automatisch an URLs anfügen.

Output Buffering

Mit Hilfe der Funktion ob_start() kann eine Ausgabepufferung aktiviert werden. Der Ausgabepuffer wird erst am Ende der PHP-Seite oder mit Hilfe der Funktion ob_end_flush() ausgegeben. Die Funktion ob_end_clean() verwirft den Ausgabepuffer. ob_get_contents() überträgt den Ausgabepuffer in eine Variable.

Headerinformation wie sie von header() und setcookie() erzeugt wird ist ungepuffert. Indem man Ausgabepufferung aktiviert, kann man überall in der Datei Headerinformationen senden, egal ob vorher schon Ausgabe erzeugt wurde oder nicht. Ausgabepufferung erhöht die Latenzen bei der Ausgabe der Webseite je nach Anwendung erheblich und kann PHP sehr viel langsamer erscheinen lassen.

Verbesserter Objektsupport

In PHP4/Zend ist es möglich, die Objektnotation von PHP zu verwenden, um objektorientiert aufgebaute Funktionsbibliotheken zu verwenden. Zum Beispiel verwenden die COM-Erweiterung und die DOMXML-Erweiterung von PHP4 diese Funktionalität.

Außerdem enthält PHP4 nun endlich Funktionen, mit denen Objekte über sich selbst Auskunft geben können: get_class() , get_parent_class() , method_exists() , is_subclass_of()

include() und eval() sind Funktionen

In PHP4 sind die früheren Anweisungen include() und eval() jetzt Funktionen, die einen Wert zurückgeben können. Der Default-Returnwert ist 1, damit Anweisungen wie if (include(...)) funktionieren.

Mit Hilfe der Anweisung return() kann man den Returncode eines include() oder eval() -Aufrufes setzen.

Verbesserter Parser

Der PHP3-Parser hatte Probleme mit Verschachtelungen von Objekten in Arrays. In PHP4/Zend ist dieses Problem behoben.

Shell-Style Here-Documents werden unterstützt.

Es gibt ein foreach() -Schleifenkonstrukt. Syntax:

foreach($my_array as $val)
    print "$val\n";

foreach($my_array as $key => $val)
    print "$key => $val\n";
Boolean

Die Schlüsselworte true und false sind nun Teil der Sprache und es gibt einen Datentyp boolean. Vergleiche werden nun durchgeführt, indem ein fremder Datentyp in Boolean konvertiert wird und dann verglichen wird: In PHP4/Zend ist das Konstrukt 5 == true eine wahre Aussage, weil (boolean) 5 in true konvertiert wird, bevor verglichen wird.

Laufzeitbindung von Funktionsnamen

Funktionen können nun aufgerufen werden, bevor sie deklariert werden.

Namespace aufgeräumt, Konfiguration überarbeitet

Der Import von Variablen in den globalen Namespace war bisher nur schwierig mit der Konfigurationsdirektive gpc_order steuerbar: Zwar konnte man die Reihenfolge unterdrücken, aber es war nicht möglich, den Import von externen Werten in globale Variablen zu verhindern, ohne diese Werte auch in den Track Vars auszuschließen. Umgebungsvariablen und Sessionvariablen waren gar nicht kontrollierbar.

In PHP4 kann man nun den Import von Werten differenziert steuern, und zwar unabhängig voneinander als globale Variablen und als Track Vars.

Ebenso wurde der Konfigurationsmechanismus überarbeitet: Es ist nun möglich, PHP mit denselben Direktiven in der Apache-Konfiguration und in der php.ini zu steuern.

Neue Funktionen und Module

Die Sprache ist außerdem um zahlreiche Funktionen und neue Module erweitert worden.

Valid HTML 4.01! Valid CSS!

2.6. Was ist neu in PHP4?
http://www.php-faq.de/q/q-php4-neu.html
Archiv der de.comp.lang.php-FAQ Dies ist eine Archivseite von 2008 und wurde seitdem nicht geändert. Das dclp-FAQ-Team