- 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.