Zum Inhalt springen
Der Guide für ein smartes Leben.
4, 5 oder 6?

Teil 2: Migration von PHP 4

Autoren: Redaktion pcmagazin und Tobias Hauser • 22.4.2009 • ca. 2:10 Min

Im Gegensatz zu den Short-Open-Tags taucht die Einbindung von PHP-Code mit Prozenzeichen <% %> kaum auf. Diese Variante wird in der php.ini mit asp_tag deaktiviert und sollte bei der Migration - sofern vorhanden - auf jeden Fall beseitigt werden. Neben der Einbindung hat sich auch bei den Da...

Im Gegensatz zu den Short-Open-Tags taucht die Einbindung von PHP-Code mit Prozenzeichen <% %> kaum auf. Diese Variante wird in der php.ini mit asp_tag deaktiviert und sollte bei der Migration - sofern vorhanden - auf jeden Fall beseitigt werden.

Neben der Einbindung hat sich auch bei den Dateinamen ein bisschen was geändert. Die Commandozeilen-Version von PHP ist ins Hauptverzeichnis gewandert und heißt nun statt cli/php.exe nur noch php-cli.exe. Ebenfalls umbenannt wurden das Apache-Modul und die CGI-Variante von PHP .

Migration von PHP 4
© Archiv

In den meisten Fällen sind die Änderungen unproblematisch, da sie entweder beim Hoster auf eine bestehende Installation zugreifen, oder PHP 5 separat installieren.

Grundsätzliches

Eine der bedeutsamsten und problematischsten Änderungen bei der Migration ist der Wechsel bei der Übergabe von Objekten an Funktionen. In PHP 4 erfolgte dies als Wert. Das heißt, zwischen dem übergebenen Parameter und dem Original gab es keine Verbindung mehr. Optional konnte man per &-Operator als Referenz übergeben. In PHP 5 ist nun - wie in den meisten modernen objektorientierten Sprachen - die Übergabe als Referenz der Standard.

Um dieses Problem zu verstehen, sehen Sie sich zuerst ein sehr einfaches Beispiel an, wo eine Referenz eingesetzt wird:

<?php
$b = 2;
$a = &$b;
$b = 3;
echo $a; //3
echo $b; //3
?>

Hier erhält die Variable $a eine Referenz auf die Variable $b. Das heißt, beide Variablen verweisen auf denselben Wert. Egal, ob im Folgenden der Wert von $a oder $b geändert wird, die Änderung wirkt sich auf beide Variablen aus. Bei der Übergabe eines Wertes an den Parameter in einer Funktion wird dieser Wert in PHP 4 standardmäßig nicht als Referenz gehandhabt:

$a = 2;
$b = 3;
function summe($a, $b) {
$a += $b;
}
summe($a, $b);
echo $a; //2

Für alle einfachen Datentypen wie die Zahlen in diesem Beispiel ist das in PHP 5 genauso. Die Werte werden als Kopie abgelegt. Das heißt, im Hauptspeicher hält PHP den Wert der Variablen $a vor. Der Parameter $a in der Funktion ist ein davon getrennter Wert.

Migration von PHP 4
Der Wert der Eigenschaft unterscheidet sich in PHP 4 und PHP 5.
© Archiv

Dieses Verhalten können Sie für PHP 4 und 5 gleichermaßen ändern, indem Sie dem Parameter ein kaufmännisches Und voranstellen und damit anzeigen, dass es sich um eine Übergabe als Referenz handelt:

$a = 2;
$b = 3;
function summe(&$a, $b) {
$a += $b;
}
summe($a, $b);
echo $a; //2

Möglich ist auch die Angabe im Aufruf der Funktion. Die Übergabe als Referenz gilt dann nur für diesen Aufruf:

summe(&$a, $b);

Diese Variante ist allerdings nicht empfehlenswert, da dadurch schwer kontrollierbar ist, wann ein Parameter als Referenz und wann als Wert übergeben wird. Diese Übergabe zur Laufzeit (engl. call time) lässt sich dementsprechend mit der Option allow_call_time_pass_reference in der php.ini deaktivieren.

Nun aber zur geänderten Situation bei Objekten: Sehen Sie sich dieses Beispiel an.

class Werte {
public $value1 = 2;
public $value2 = 3;
}
$werteObj = new Werte();
function summe($werte) {
$werte->value1 += $werte->value2;
}
summe($werteObj);
echo $werteObj->value1;