Teil 4: Migration von PHP 4
- Migration von PHP 4
- Teil 2: Migration von PHP 4
- Teil 3: Migration von PHP 4
- Teil 4: Migration von PHP 4
- Teil 5: Migration von PHP 4
Letzteres ist ein selteneres Problem, die Übergabe als Referenz ein häufigeres. Beiden gemeinsam ist, dass die Auswirkungen und Vorkommen schwer festzustellen sind und insofern bei der Migration viel Arbeit macht. Deswegen bietet PHP eine entsprechende Einstellung, die statt der neuen Zend-Engine ...
Letzteres ist ein selteneres Problem, die Übergabe als Referenz ein häufigeres. Beiden gemeinsam ist, dass die Auswirkungen und Vorkommen schwer festzustellen sind und insofern bei der Migration viel Arbeit macht. Deswegen bietet PHP eine entsprechende Einstellung, die statt der neuen Zend-Engine 2, die diese Änderungen hervorruft, auf die alte Zend-Engine 1 setzt:

zend.ze1_compatibility_mode = On
Bei dieser Einstellung bleiben die OOP-Funktionen von PHP 5 nutzbar und auch veraltete und aussortierte Funktionen sind nicht wieder verfügbar. In der Realität wird der Kompatibilitätsmodus allerdings dennoch selten eingesetzt, da eine Kombination der neuen Funktionalitäten und der alten Verhaltensweise keinen Sinn macht und sich auch mit so gut wie allen Erweiterungen und Bibliotheken nicht verträgt.
Neben diesen gravierenden Neuerungen gibt es bei einigen Konventionen und Funktionen Änderungen, die nicht abwärtskompatibel sind. So reserviert PHP 5 beispielsweise neue Schlüsselwörter. Sollten Sie also zufällig Pech haben, findet sich in Ihren PHP-4-Funktionsbezeichnungen irgendwo ein neues Schlüsselwort, das in der OOP von PHP 5 zum Einsatz kommt.
Eine Liste finden Sie unter . Dieses Pech hat man in der Realität allerdings selten. Bei den Funktionen hilft ein Blick in . Beispielsweise erlaubt array_merge() nur noch Arrays als Parameter.
Früher ließen sich auch einfache Datentypen wie Strings anfügen. Eine andere Änderung ist eigentlich eher eine ungewöhnliche Verhaltensweise in PHP 4. Die rückwärtsgerichtete Suche in Strings hat in PHP 4 immer die Position des vordersten der vorhandenen Einzelzeichen geliefert - im folgenden Beispiel also 3 für die Position der 4.
In PHP 5 wird der Suchstring als ganzer String gewertet, und nur wenn er vorkommt, wird seine Position zurückgeliefert - im Beispiel also false.
<?php
$value = '1234567890';
var_dump(strrpos($value, '468'));
?>
Objektorientierung
Die größte Zahl an Neuerungen ist in PHP 5 bei der Objektorientierung zu finden. Für die Migration sind die meisten unproblematisch, denn was bisher nicht vorhanden war, kann auch nicht stören. Zwei Dinge sind allerdings geändert. In PHP 4 entsprach der Konstruktor, das heißt, die Methode, die beim Erstellen eines Objektes ausgeführt wird, dem Namen der Klasse.
In PHP 5 gibt es dafür die Sondermethode __construct(). Wenn Sie diese globale Änderung nicht durchführen wollen, können Sie auch noch den alten Konstruktor belassen. Er wird von PHP 5 ebenfalls beim Erstellen des Objektes ausgeführt, allerdings nur, wenn kein Konstruktor mit __construct() vorliegt. Und eine weitere Einschränkung gibt es auch hier: Der Konstruktor mit dem Namen der Klasse wird in PHP 5 nur aufgerufen, wenn er in derselben Klasse liegt.
In PHP 4 war es auch möglich, damit einen Konstruktor in der übergeordneten, vererbenden Klasse direkt auszuführen.Eine weitere Neuerung in PHP 5 sind die Attribute zur Sichtbarkeit. Mit public können Sie angeben, dass eine Variable von außerhalb der Klasse zugreifbar ist, private macht sie nur innerhalb der Klasse verfügbar und protected gibt sie für die Klasse und die erbenden Klassen frei.
PHP 4 kennt diese verschiedenen Sichtbarkeitslevel nicht, sondern verwendet standardmäßig var. In frühen PHP-5-Versionen bis inklusive PHP 5.1.3 hat das Fehlerlevel E_STRICT dafür gesorgt, dass var-Vorkommen einen Fehler ausgeworfen haben und dementsprechend auch einfach beseitigt werden konnten.
Dieses Verhalten wurde allerdings wieder entfernt und var produziert heute auch bei höchstem Fehlerlevel keinen Fehler. Dementsprechend ist die var-Ersetzung kein Muss mehr, aber unbedingt anzuraten. Möchte man pauschal ersetzen, ist die beste Option, public zu verwenden. Ansonsten muss man im Einzelfall prüfen, ob eine Eigenschaft außerhalb des Objekts beziehungsweise der Klasse eingesetzt wird.