PHP エンジンは、PHP の非表示のプロパティに__isset()
アクセスするたびに呼び出されることを期待しているかもしれません。しかし、それは真実ではありません。ドキュメントを確認してください:
__isset() は、アクセスできないプロパティで isset() または empty() を呼び出すことによってトリガーされます。
したがって、それは予想される動作です。
var_dump(isset($c->a));
トリガーし__isset()
ます。
他のすべての行は単にトリガーし__get()
ます。これらのインデックスを設定しなかったため、これは予想される動作です。
コードを次のように変更します。
class c {
public $x = array();
public function __get($name) {
var_dump(__METHOD__);
return $this->x[$name];
}
public function __isset($name) {
var_dump(__METHOD__);
return isset($this->x[$name]);
}
}
どのメソッドが実際に呼び出されているかを確認します。これにより、次のことが得られます。
c::__isset <------ called!
bool(false)
c::__get
Notice: Undefined index: a in /tmp/a.php on line 6
Call Stack:
0.0002 647216 1. {main}() /tmp/a.php:0
0.0003 648472 2. c->__get() /tmp/a.php:16
<---------------------- not called
bool(false)
c::__get
Notice: Undefined index: b in /tmp/a.php on line 6
Call Stack:
0.0002 647216 1. {main}() /tmp/a.php:0
0.0005 648656 2. c->__get() /tmp/a.php:17
<---------------------- not called
bool(false)
c::__get
Notice: Undefined index: d in /tmp/a.php on line 6
Call Stack:
0.0002 647216 1. {main}() /tmp/a.php:0
0.0006 648840 2. c->__get() /tmp/a.php:18
<---------------------- not called
bool(false)