有很多关于这个问题的问题,特别是
this one,但这并没有帮助我.
在property_exists和isset之间有歧义,所以在提出我的问题之前,我要指出一点:
property_exists
所以在下面的例子中:
class testA
{
private $a = null;
}
class testB extends testA
{
}
$test = new testA();
echo var_dump(property_exists($test, 'a')); // true
// parent's private property becomes invisible for its child
$test = new testB();
echo var_dump(property_exists($test, 'a')); // false
isset
isset检查属性中是否存在值,如果值等于false,则检查是否未设置.
$var = null;
echo var_dump(isset($var)); // false
$var = '';
echo var_dump(isset($var)); // true
$var = false;
echo var_dump(isset($var)); // true
$var = 0;
echo var_dump(isset($var)); // true
$var = '0';
echo var_dump(isset($var)); // true
isset和property_exists在神奇添加的属性上的行为
一个属性可以存在一个空值,所以我不能使用__isset魔术方法知道一个属性是否存在.我也不能使用property_exists,因为使用魔法方法添加属性.
这是一个例子,但这只是一个例子,因为在我的应用程序中,魔术设置的属性被存储在对象外部.
class test {
private $data = array();
public function __get($key) {
echo "get $key\n";
return array_key_exists($key, $data) ? $data[$key] : null;
}
public function __set($key, $value) {
echo "set $key = $value\n";
$this->data[$key] = $value;
}
public function __isset($key) {
echo sprintf("isset $key ( returns %b )", isset($this->data[$key]));
return isset($this->data[$key]);
}
}
$test = new test();
$test->x = 42;
isset($test->x); // 1
$test->y = null;
isset($test->y); // 0
property_exists($test, 'y'); // 0
所以这里是我的问题:
Is there a magic method or an SPL interface to implement property_exist with magically added properties ?