El título puede parecer un poco tonto, pero estoy totalmente en serio con esto. Hoy en el trabajo me encontré con un comportamiento extraño de PHP que no podía explicar. Afortunadamente, este comportamiento se solucionó en PHP 7.4, por lo que parece que alguien también se topó con eso.
Hice un pequeño ejemplo para ilustrar lo que salió mal:
<?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);
Ejecute este código aquí: https://3v4l.org/DBt3o
Aquí hay una pequeña explicación de lo que está sucediendo aquí. Tenemos las clases A y B, que comparten una propiedad $a
. Los lectores cuidadosos notaron que la propiedad $a
tiene dos visibilidades diferentes (pública, privada). Nada lujoso hasta ahora. La magia ocurre en el __sleep
método que se llama mágicamente cuando hacemos serialize
nuestra instancia. Queremos tener todas las variables de objeto que se obtiene con get_object_vars
reducir esto a sólo las teclas con array_keys
y salida con todo var_dump
.
Esperaría algo como esto (esto sucede desde PHP 7.4 y es mi salida esperada):
array(2) {
[0]=>
string(1) "b"
[1]=>
string(1) "a"
}
Pero lo que obtengo es esto:
array(3) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[2]=>
string(1) "a"
}
¿Cómo podría ser que PHP entregue una matriz con dos claves completamente idénticas? ¿Quién puede explicar qué sucede aquí internamente porque en PHP simple no puedo generar una matriz con dos claves completamente idénticas? ¿O extraño algo obvio aquí?
Al principio, mis compañeros de trabajo no querían creerme, pero ninguno de ellos tuvo una buena explicación después de entender lo que está sucediendo aquí.
Realmente me encantaría ver una buena explicación.
var_dump(array_keys((array)$this));