info@a-coding-project.de

Unterschiede von PHP 5 zu PHP 6

Auch bei der Skriptsprache PHP bleibt die Entwicklung nicht stehen und drei Jahre nach der ersten Sammlung von Ideen für PHP 6 wird es immer konkreter, wie die neue Version der Sprache aussehen soll. Obwohl ein konkretes Veröffentlichungsdatum noch nicht feststeht, können schon viele eindeutige Aussagen darüber getroffen werden, auf was sich die Programmierer einstellen müssen. Die Abwärtskompatibilität zu den Vorgängerversionen PHP5 aber auch zu PHP4 ist ein großes Thema, was noch für viel Gesprächsstoff sorgen wird.

Arbeit mit PHP 6 während der Entwicklung

Ein Datum für die entgültige Version von PHP 6 gibt es noch nicht, aber in Testumgebungen kann bereits mit der Entwicklungsvariante der neuen PHP-Version gearbeitet werden. Die jeweils aktuelle Entwicklungsversion kann über die Webseite "http://snaps.php.net" heruntergeladen werden. An der Installation bzw. Integration in den Webserver wird sich auch mit der neuen Version nichts ändern.

Verschwundene / Geänderte Einstellungen in der php.ini

Zwischen den einzelnen PHP-Versionen wurden einige Einstellungen mitgezogen, die aufgrund der Abwärtskompatibilität noch vorhanden waren, es aber auf der anderen Seite auch immer deutlich wurde, dass sie früher oder später verschwinden würden. Bei einigen dieser Konfigurationsparameter wird man in PHP 6 diesen Schritt vollziehen.

Parameter register_globals

Im Laufe der Zeit hat dieser Parameter immer wieder zu Diskussionen bzgl. der Sicherheit geführt. Bei PHP5 wurde der Parameter zwar beibehalten, jedoch standardmäßig auf "off" geschaltet. In der neuen PHP-Version wird dieser Parameter nicht mehr vorhanden sein. Die globalen Variablen $HTTP_*_VARS (* = GET | POST) werden ebenfalls verschwinden. In diesem Zusammenhang ist der Parameter register_long_arrays ebenso überflüssig.
In der neuen Version gibt es zukünftig nur noch die superglobalen Variablen/Arrays $_GET und $_POST.

Praxistipp für entfernten register_globals-Parameter

Wer nach der Umstellung auf PHP 6 nicht gleich die Möglichkeit hat, seine Anwendung(en) zu überarbeiten und bisher auf die register_globals gesetzt hat, kann den folgenden Code verwenden, um sich die Umstellung zu erleichtern:

if (!ini_get('register_long_arrays'))
{
 $HTTP_POST_VARS =& $_POST;
 $HTTP_GET_VARS =& $_GET;
 $HTTP_COOKIE_VARS =& $_COOKIE;
 $HTTP_SERVER_VARS =& $_SERVER;
 $HTTP_ENV_VARS =& $_ENV;
 $HTTP_POST_FILES =& $_FILES;
}

Bereich Safe Mode

Wenn PHP im Safe Mode läuft, wird zum Beispiel überprüft, ob der Skripteigentümer auch gleichzeitig der Eigentümer der Datei ist, die bearbeitet wird. Im Safe Mode ist es neben dem Sperren von Funktionen der allgemeine Grundsatz, dass PHP Skripte nur noch dann Zugriff auf Dateien haben, wenn diese dem gleichen Nutzer gehören. Dieses Problem tritt u.a. bei mit FTP hochgeladenen Dateien auf. Der standardmäßige Eigentümer dieser Dateien ist der FTP-User, während der User für den Webserver gleichzeitig der Besitzer des PHP-Skriptes ist. Der "Safe Mode" sollte ursprünglich in Shared Hosting-Umgebungen für die Sicherheit sorgen. Der "Safe Mode" stellt eine eigene Sektion in der php.ini da.
Der Konfigurationsparameter open_basedir soll von der Abschaffung des Safe Modes profitieren. Wenn hier ein Pfad angegeben ist, darf nur auf Skripte, die in diesem Verzeichnis hinterlegt sind, zugegriffen werden.

magic_quotes - Filtereinstellungen

Diese Einstellungen waren dafür zuständig, um Nutzereingaben zu filtern. Das bekannteste Beispiel dafür ist das Voranstellen eines Backslashes bei einfachen und doppelten Anführungszeichen, die mit GET oder POST an das PHP-Skript übermittelt wurden. Damit sollten Angriffe wie z. B. eine SQL-Injection vermieden werden. Die magic_quotes-Einstellungen waren jedoch nicht zuverlässig und konnten vom Programmierer umgangen werden.
In PHP 6 sollen diese Parameter verschwinden und durch optional einsetzbare Filterfunktionen ersetzt werden, die auf der PECL-Erweiterung "filter" beruhen, die standardmäßig schon seit PHP 5.2 mit dabei ist.

Anzeige eines Fehlers in PHP 6

Wenn in PHP 6 ein älteres Skript ausgeführt wird, dass die obigen Einstellungen benutzt, wird ein beim Start von PHP ein Fehler der Kategorie E_CORE_ERROR angezeigt. Die Funktionalität der genannten Einstellungen wird in PHP 6 komplett verschwinden.

Verbesserung der Sicherheit

Zur Verbesserung der Sicherheit der PHP-Distribution wird zum einen der allow_url_fopen-Parameter auf zwei verschiedene eigenständige Einstellungen aufgeteilt. Der ursprüngliche Parameter allow_url_fopen bleibt und ist standardmäßig aktiviert während der neue Parameter allow_url_include normalerweise deaktiviert ist. Weiterhin wird ein Schutz gegen das Splitting von HTTP-Serverantworten eingeführt.

Kategorisierung der Fehlermeldungen

Standardmäßig werden alle Fehlermeldungen der E_STRICT-Kategorie der Kategorie "E_ALL" hinzugefügt, um den Programmierern die Tragweite mancher Fehler besser zu verdeutlichen.

Funktionen, die aus dem PHP-Kern verschwinden

Reguläre Ausdrücke nach POSIX

Bisher gab es in PHP zwei verschiedene Varianten zur Nutzung von regulären Ausdrücken. Die POSIX und die PERL-kompatible Alternative waren gleichzeitig verwendbar. Da es mit der POSIX-Variante mehr Probleme gegeben hat, soll diese in PECL ausgelagert werden. Die freien Stellen im PHP-Quellcode werden auf PCRE (Perl-compatible regular expressions) umgeschrieben. Weiterhin soll es noch eine Unicode-konforme Variante von PCRE geben.

Kompatibilität mit altem Interpreter

Die Kompatibilität mit der Version 1.0 der Zend Engine (= PHP Intepreter) wird in der Version 6 nicht mehr vorhanden sein.

Unterstützung von alten Extensions

In der Version 6 werden zum einen die Version 1 der GD-Library und die erste Version der Freetype-Bibliothek nicht mehr unterstützt.

Neue Features für PHP

Eigener Zwischenspeicher

Auf der Basis der bereits vorhandenen PECL-Erweiterung APC (= Alternative PHP Cache) wird ein eigener Zwischenspeicher (Cache) für PHP-Skripte eingeführt. Dazu soll die genannte Erweiterung fest in PHP integriert werden. Dabei ist zu beachten, dass die Erweiterung standardmäßig deaktiviert ist, da der Administrator einige Einstellungen vornehmen muss, damit der neue Cache sinnvoll genutzt werden kann.

Eigener XML-Parser

Die beiden Erweiterungen "XMLReader" und "XMLWriter", die bereits in einigen PHP5-Versionen zu finden sind, sollen in der neuen Version ein fester Bestandteil der Distribution werden. Dabei soll die Groß- und Kleinschreibung vereinheitlicht werden. Die beiden Pakete erlauben das Lesen (XMLReader) und Schreiben (XMLWriter) von XML-Dateien. Beim Parsen der XML-Dokumente wird mit Hilfe von Schleifen ein Zugriff auf jeden einzelnen Elementknoten gewährleistet.

Neue Extension fileinfo

Die bisherige PECL-Erweiterung soll ebenfalls fest in die neue PHP-Version integiert werden. Diese Extension soll Informationen zum Mime-Typ von Dateien liefern und zum anderen die bisherige mime magic-Erweiterung ersetzen, die verschwinden wird. Standardmäßig wird diese Erweiterung aktiviert sein.

Erweiterung der Webservice-Extension

Die bereits vorhandene Extension für SOAP soll standardmäßig aktiviert sein und um neue Funktionen für die Sicherheit erweitert werden.

Unterstützung des Unicode-Zeichensatzes

Bereits seit Jahren wird von den Nutzern und Programmierern von PHP die Unicode-Unterstützung gewünscht. In der Version 6 von PHP soll es damit endlich soweit sein. In den bisherigen Versionen waren alle Strings 1 Byte (= 8 Bit) lang, was in Ordnung war, so lange ein Zeichensatz verwendet wurde, der ebenfalls 1 Byte pro Zeichen genutzt hat. Nach diesem Prinzip war aber nur die Darstellung von 256 Zeichen möglich. Durch die neue Unicode-Unterstützung wird die Anzeige von ca. 100000 verschiedenen Zeichen möglich. PHP wird konkret die Zeichensätze "UTF-8", "UTF-16" und "UTF-32" aus der Unicode-Familie unterstützen.
Die Unicode-Unterstützung basiert auf der Erweiterung "ICU" (= International Components for Unicode) von IBM und wird aufgrund ihrer Größe standardmäßig nicht aktiviert sein. Es wird einen neuen Konfigurationsparameter unicode.semantics geben, mit der die Erweiterung aktiviert werden kann. Die neue Unicode-Erweiterung wird abwärtskompatibel sein, so dass in diesem Zusammenhang bei den Skripten nichts verändert werden muss.

Hinweis: Zur PHP-Performance im Zusammenhang mit der ICU-Erweiterung sind schon erste Aussagen vorhanden. PHP 6 mit deaktivierter Unicode-Unterstützung ist nicht wesentlich langsamer als PHP 5. Es besteht aber ein großer Geschwindigkeitsunterschied zwischen PHP5 ohne Unicode und PHP 6 mit Unicode.

Erweiterung der Datumsfunktionalität

Die bisherigen Datumsroutinen sollen in diese Richtung erweitert werden, dass sie plattformunabhängig mit Zeiten vor dem Jahr 1970 arbeiten kann.

Zuschaltbarer Input-Filter

Mit diesem Werkzeug soll es Administratoren möglich sein, über ein zentales Werkzeug die Skripte ihrer Anwendungen abzusichern. Diese Features sind hauptsächlich eine Reaktion auf XSS-Hacks und sollen den Entwicklern die Möglichkeit geben, sog. Policies (= Regeln) für das Filtern von Eingaben von außen ($_POST, $_GET usw.) festzulegen. Diese Regeln sollen dann für die gesamte Plattform gelten.
Die Input Filter basieren auf der bereits bekannten PECL-Erweiterung input_filter.

Eigene Namensräume

Zum Zeitpunkt der Erstellung des Artikels war noch nichts über die praktische Umsetzung bekannt, aber es sollen eigene Namensräume für PHP-Skripte eingeführt werden. Dieses im Rahmen der objektorientierten Programmierung relevante Feature ermöglicht das Zusammenfassen von Variablen, Funktionen und Objekten unter einem bestimmten Namen. Dies macht im Prinzip eine Mehrfachnutzung der gleichen Funktionen jederzeit möglich. Dazu soll über der Definition einer Klasse mit dem Schlüsselwort class das neue Schlüsselwort namespace angegeben werden, mit der Namensraum für die betreffende Klasse festgelegt wird. Alle Elemente der Klasse sind automatisch in diesem Namensraum enthalten.

namespace Testklasse;

class Testklasse1
{
... Funktionen der Klasse ...
}

Neustrukturierung der Datenbankunterstützung

Innerhalb des PHP-Kernes wird die Unterstützung für den Zugriff auf Datenbanken neu strukturiert. Alle Funktionalitäten, die in diesem Zusammenhang eine Rolle spielen, sollen über die Extensions realisiert werden und aus dem Kern verschwinden. Dies geschieht für alle Datenbank-Distributionen, für die PHP einen Zugriff zur Verfügung stellt.

Unterstützung für 64 Bit-Integer-Werte

In PHP 6 werden Integerwerte mit einer Größe von 64 Bit unterstützt werden.

Überarbeitung des FastCGI-Codes

Der Quellcode für die FastCGI-API wird in der neuen PHP-Version überarbeitet und für die CGI SAPI standardmäßig aktiv sein. Die Option zur Deaktivierung soll es dafür nicht geben.

Veränderungen bei den PHP-Funktionen

Ergänzung der break-Funktion

Diese Funktion kommt oft bei while-Schleifen zum Einsatz, um diese nach der Erfüllung einer bestimmten Bedingung abzubrechen. Es wurde der Wunsch an die PHP-Entwickler herangetragen ein aus der Basic-Welt bekanntes GOTO-Konstrukt zu implementieren. Diesen Wunsch ist man durch die Erweiterung der break-Funktion nachgekommen, in dem man in der neuen Version ein Label mit angeben kann. Ist eine solche Kennzeichnung mit angegeben, springt die Funktion automatisch dorthin.

Erweiterung der foreach-Schleife

Bisher war es nur möglich ein bestimmtes Array mit einer foreach-Schleife auszulesen. In der neuen Version soll es möglich sein, eine Liste von Arrays gleichzeitig auszulesen. Das folgende Code-Segment ist ein Beispiel, wie dies realisiert werden kann:

foreach( $a as $k => list($a, $b)) { ... }

{ }-Operator und [ ]-Operator

Um einen String zu indizieren bzw. den bestimmte Teile eines Strings anzusprechen, konnten bisher beide Operatoren verwendet werden. Allerdings verursacht der { }-Operator bereits ab der PHP-Version 5.1 einen E_STRICT-Fehler in diesem Zusammenhang. In der neuen Version soll er komplett abgeschafft werden.

Der ifsetor()-Operator

Der Ausgangspunkt für diesen neuen Operator ist das Problem, dass zuerst überprüft werden soll, ob eine Variable initialisiert wurde. Wenn das nicht der Fall ist, soll ihr ein Wert zugewiesen werden. Bisher kann dies durch den folgenden Code realisiert werden:

if(!isset($testvariable)) { $testvariable = "bla"; }

Der neue Operator soll diese Schreibweise etwas vereinfachen. Einen weiteren Mehrwert bietet er nicht. Dieses Code-Beispiel stellt den obigen Vorgang nach der neuen Variante da:

$testvariable = ifsetor($testvariable, "bla");

Schlüsselwort var in Klassen

In PHP 4 wurde innerhalb von Klassen das Schlüsselwort var zur Variablendefinition verwendet. Die Nutzung dieses Schlüsselwortes verursachte in PHP 5 eine Warnmeldung der Kategorie E_STRICT. Diese Warnmeldung wird in PHP 6 entfernt und var wird zukünftig die gleiche Bedeutung wie das Schlüsselwort public haben.

Weiterlesen: ⯈ Kontaktformular mit 2 Zeilen Code gegen Spam schützen

Über uns

Stefan Wienströer

Wir entwickeln Webanwendungen mit viel Leidenschaft. Unser Wissen geben wir dabei gerne weiter. Mehr über a coding project

Auch interessant