PHP magic function __set, __get, __isset 與 empty()
此次遇到在判斷 empty() __get() value, // if (empty($this->member)) 判斷永遠為 true 的情形 trace 了一些文章,發現因為 empty() 會執行 isset() 進行判斷 然而在 magic function 中 __get() 的 value isset 會使用 __isset() 進行包裝 所以需要再增加 __isset() method 處理
<?php
class Test
{
protected $data = [];
public function __set($key, $value)
{
$this->data[$key] = $value;
}
public function __get($key)
{
return $this->data[$key];
}
}
$test = new Test();
$test->member = 'ray';
var_dump($test->member); //'ray'
var_dump(empty($test->member)); //true !! what?
$member = $test->member;
var_dump(empty($member)); //false ????
class Test
{
protected $data = [];
public function __set($key, $value)
{
$this->data[$key] = $value;
}
public function __get($key)
{
return $this->data[$key];
}
public function __isset($key)
{
return isset($this->data[$key]);
}
}
$test = new Test();
$test->member = 'ray';
var_dump($test->member); //'ray'
var_dump(empty($test->member)); //false
$member = $test->member;
var_dump(empty($member)); //false