property_exists | php
プロパティの存在判別が出来ないのかという話です。
http://www.php.net/manual/ja/function.property-exists.php
> isset() とは対照的に、 プロパティの値が NULL の場合でも property_exists() は TRUE を返します。
これだと思ったら
> property_exists() 関数は、マジックメソッド __get を使ってアクセスするプロパティを検出することはできません。
むー。
stdClassの場合。
$o = new stdClass(); var_dump($o->abc); // PHP Notice: Undefined property: stdClass::$abc in test.php on line 5 // NULL var_dump(isset($o->abc)); // bool(false) var_dump(property_exists($o,'abc')); // bool(false) $o->abc=null; var_dump($o->abc); // NULL var_dump(isset($o->abc)); // bool(false) var_dump(property_exists($o,'abc')); // bool(true)
__get __setを書くと・・・
class myClass{ private $data = array(); public function __set($key,$value){ $this->data[$key]=$value; } public function __get($key){ return $this->data[$key]; } } $o = new myClass(); var_dump($o->abc); // PHP Notice: Undefined index: abc in test.php on line 9 // NULL var_dump(isset($o->abc)); // bool(false) var_dump(property_exists($o,'abc')); // bool(false) $o->abc=null; var_dump($o->abc); // NULL var_dump(isset($o->abc)); // bool(false) var_dump(property_exists($o,'abc')); // bool(false)
こんな感じで最後もfalseに。
is_null( $o->abc ); // PHP Notice: Undefined index: abc in test.php on line 9 // bool(true)
myClassでsetする前にgetするとnullなんだけどnoticeが出る。
マジックメソッドがオーバーロードされているとプロパティ存在判別が出来ない。
判別できない状態でアクセスする警告が出るなぁと思った話ですが
__get 内で issetとかしてエラーを返さないでくれれば良いだけか。