__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() より手前で判定してる?