Der Titel mag ein bisschen albern erscheinen, aber ich meine das total ernst. Heute bei der Arbeit stieß ich auf ein seltsames PHP-Verhalten, das ich nicht erklären konnte. Glücklicherweise ist dieses Verhalten in PHP 7.4 behoben, so dass anscheinend auch jemand darauf gestoßen ist.
Ich habe ein kleines Beispiel gemacht, um zu veranschaulichen, was schief gelaufen ist:
<?php
class A {
private $a = 'This is $a from A';
public $b = 'This is $b from A';
public function __sleep(): array
{
var_dump(array_keys(get_object_vars($this)));
return [];
}
}
class B extends A
{
public $a = 'This is $a from B';
}
$b = new B;
serialize($b);
Führen Sie diesen Code hier aus: https://3v4l.org/DBt3o
Hier ist eine kleine Erklärung, was hier los ist. Wir müssen Klassen A und B, die beide eine Eigenschaft teilen $a
. Sorgfältige Leser bemerkten, dass die Immobilie $a
zwei verschiedene Sichtbarkeiten hat (öffentlich, privat). Bisher nichts Besonderes. Die Magie geschieht in der __sleep
Methode, die magisch aufgerufen wird, wenn wir serialize
unsere Instanz. Wir wollen alle Objektvariablen, die wir erhalten get_object_vars
, auf nur die Schlüssel mit reduzieren array_keys
und alles mit ausgeben var_dump
.
Ich würde so etwas erwarten (dies geschieht seit PHP 7.4 und ist meine erwartete Ausgabe):
array(2) {
[0]=>
string(1) "b"
[1]=>
string(1) "a"
}
Aber was ich bekomme ist folgendes:
array(3) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[2]=>
string(1) "a"
}
Wie könnte es sein, dass PHP ein Array mit zwei völlig identischen Schlüsseln liefert? Wer kann erklären, was hier intern passiert, weil ich in einfachem PHP kein Array mit zwei völlig identischen Schlüsseln generieren kann? Oder vermisse ich hier etwas Offensichtliches?
Meine Mitarbeiter wollten mir zunächst nicht glauben, aber keiner von ihnen hatte eine gute Erklärung dafür, nachdem sie verstanden hatten, was hier passiert.
Ich würde wirklich gerne eine gute Erklärung sehen.
var_dump(array_keys((array)$this));