タイトルは少しばかげているように見えるかもしれませんが、私はこれについて完全に真剣です。今日の仕事で、説明できない奇妙なPHPの動作に遭遇しました。幸いにも、この動作はPHP 7.4で修正されているため、誰かがそれに偶然出会ったようです。
私は何がうまくいかなかったかを説明するために小さな例を作りました:
<?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);
このコードをここで実行:https : //3v4l.org/DBt3o
ここで何が起こっているのかを少し説明します。クラスAとBがあり、どちらもプロパティを共有しています$a
。注意深い読者は、このプロパティに$a
は2つの異なる可視性(パブリック、プライベート)があることに気づきました。今のところ何も変わっていない。魔法__sleep
はserialize
、インスタンスのときに魔法のように呼び出されるメソッドで発生します。取得したすべてのオブジェクト変数に、これをget_object_vars
のキーのみに減らし、でarray_keys
すべてを出力させたいと考えていますvar_dump
。
私はこのようなものを期待します(これはPHP 7.4以降に起こり、私が期待する出力です):
array(2) {
[0]=>
string(1) "b"
[1]=>
string(1) "a"
}
しかし、私が得るのはこれです:
array(3) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[2]=>
string(1) "a"
}
PHPが2つの完全に同一のキーを持つ配列を提供するのはどうしてでしょうか?プレーンなPHPでは2つの完全に同一のキーを持つ配列を生成できないため、内部で何が起きているのか誰が説明できますか?または、ここで明らかな何かを見逃していますか?
私の同僚は最初は私を信じたくありませんでしたが、彼らがここで何が起こっているのかを理解した後、彼らの誰もこれをうまく説明できませんでした。
私は本当に良い説明を見たいです。
var_dump(array_keys((array)$this));