issetは__get()越しに取得できる変数でfalseを返すらしい
__get()
使ってたの忘れてて、なんでfalseが返ってくるのか15分くらい悩んでた。
↓のコードの通りです。
<?php
/**
* getterを持ってるクラス
*/
class Klass
{
private $_data = [
'foo' => 'bar',
'hoge' => 'piyo',
];
public function __get($name)
{
$ret = null;
if (array_key_exists($name, $this->_data)) {
$ret = $this->_data[$name];
}
return $ret;
}
}
$klass = new Klass();
var_dump( $klass->hoge ); // -> piyo
var_dump( isset($klass->hoge) ); // -> false
var_dump( empty($klass->hoge) ); // -> true
var_dump( is_null($klass->hoge) ); // -> false
// いったん変数に移さないとissetできない
$hoge = $klass->hoge;
var_dump( isset($hoge) ); // -> true
確かにプロパティとしては存在しないから、言われてみれば isset()
でfalseが返ってくるのはその通りなんですけど、それなら is_null()
でfalseが返ってくるのが罠っぽいです。
内部的には isset()
のほうが is_null()
より手前で判定してる?