Teil 3: 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
Hier gibt es eine Klasse mit zwei Eigenschaften. Für PHP 4 sind hier leichte Modifikationen notwendig. Dort werden Eigenschaften nur mit var gekennzeichnet. Da dies in PHP 5 auch noch funktioniert, könnten Sie auch diese Version verwenden....
Hier gibt es eine Klasse mit zwei Eigenschaften. Für PHP 4 sind hier leichte Modifikationen notwendig. Dort werden Eigenschaften nur mit var gekennzeichnet. Da dies in PHP 5 auch noch funktioniert, könnten Sie auch diese Version verwenden.
class Werte {
var $value1 = 2;
var $value2 = 3;
}
Nach der Klassendefinition erstellt der Code ein Objekt der Klasse: Dieses Objekt wird einer Funktion übergeben. Innerhalb der Funktion erhält eine der Eigenschaften des übergebenen Objekts einen neuen Wert. Dass dieser hier aus der Addition zweier bestehender Werte stammt, ist unerheblich.
Wenn Sie nun die geänderte Eigenschaft außerhalb der Funktion nach dem Funktionsaufruf ausgeben, sehen Sie den Unterschied zwischen PHP 4 und 5. Der Übersichtlichkeit halber können Sie mit php_version() noch die PHP-Version ausgeben. In PHP 4 wird der Ursprungswert von value1 erhalten, da die Änderung auf einem kopierten Objekt erfolgt.
Reference und Wert wirken allerdings nicht nur an dieser Stelle, sondern auch beim Zuweisen von Objekten an andere Variablen:
<?php
class Werte {
public $value1 = 2;
//var $value1 = 2; // PHP 4
}
$werte = new Werte();
$werte2 = $werte;
$werte->value1 = 5;
echo $werte2->value1;
?>
Im Beispiel wird aus einer Klasse ein Objekt erstellt. Anschließend wird die Variable einer zweiten zugewiesen. In PHP 4 würde diese Zuweisung ebenfalls als Kopie erfolgen, die Ausgabe ist hier also 2. In PHP 5 referenzieren beide Variablen auf dasselbe Objekt.
Dadurch ändert sich der Wert der Eigenschaft value1 für beide Variablen und die Ausgabe ist 5. Dies ist auch ein Fall, der auftritt, wenn Sie keine Objektorientierung einsetzen. Dazu reicht es, wenn eine externe Klasse oder irgendeine Bibliothek verwendet wird, die mit Objekten arbeitet.
Sollten Sie in PHP 4 schon mit dem Referenz-Operator eine Übergabe per Referenz anstoßen, können Sie diesen bei der Migration entfernen. Eine Fehlermeldung wird durch den zusätzlichen Einsatz allerdings nicht hervorgerufen und das Verhalten ändert sich ja in diesem Fall nicht. Wenn Sie in PHP 4 ein Objekt als Wert übergeben wollen, müssen Sie es klonen. Dafür dient das Schlüsselwort clone:
$werte2 = clone $werte;
Das clone-Ereignis können Sie in PHP 5 auch in einer eigenen Methode __clone() abfangen. Diese Methode mit zwei Unterstrichen fällt in die Kategorie der besonderen PHP-Methoden, die alle in PHP 5 hinzugefügt wurden.
Eine ähnliche Verhaltensändeurng zwischen PHP 4 und 5 kann ebenfalls zu Problemen führen: Beim Objektvergleich wird in PHP 5 bei der exakten Gleichheit === nur true zurückgeliefert, wenn die zwei Variablen dieselbe Objektinstanz enthalten, also per Referenz übergeben wurden. Bei unterschiedlichen Instanzen und normaler Gleichheit == gilt in PHP 4 und 5 bei beiden dann true, wenn die Klasse und alle Eigenschaften gleich sind.
<?php
class Werte {
var $value1 = 2;
}
$werte = new Werte();
$werte2 = new Werte();
var_dump($werte === $werte2);
?>