O título pode parecer um pouco bobo, mas eu sou totalmente sério com isso. Hoje no trabalho, me deparei com um comportamento estranho do PHP que não consegui explicar. Felizmente, esse comportamento foi corrigido no PHP 7.4, então parece que alguém se deparou com isso também.
Fiz um pequeno exemplo para ilustrar o que deu errado:
<?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);
Execute este código aqui: https://3v4l.org/DBt3o
Aqui está uma pequena explicação do que está acontecendo aqui. Temos as classes A e B, que compartilham uma propriedade $a
. Os leitores cuidadosos notaram que a propriedade $a
tem duas visibilidades diferentes (pública, privada). Nada extravagante até agora. A mágica acontece no __sleep
método que é chamado magicamente quando usamos serialize
nossa instância. Queremos ter todas as variáveis de objeto com as quais get_object_vars
reduzimos isso apenas para as chaves array_keys
e produzimos tudo com var_dump
.
Eu esperaria algo assim (isso acontece desde o PHP 7.4 e é a minha saída esperada):
array(2) {
[0]=>
string(1) "b"
[1]=>
string(1) "a"
}
Mas o que eu recebo é o seguinte:
array(3) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[2]=>
string(1) "a"
}
Como poderia ser, que o PHP oferece uma matriz com duas chaves completamente idênticas? Quem é capaz de explicar o que acontece aqui internamente porque, em PHP simples, não sou capaz de gerar uma matriz com duas chaves completamente idênticas? Ou eu sinto falta de algo óbvio aqui?
Meus colegas de trabalho não quiseram acreditar em mim a princípio, mas nenhum deles teve uma boa explicação disso depois de entenderem o que está acontecendo aqui.
Eu realmente adoraria ver uma boa explicação.
var_dump(array_keys((array)$this));