关于这个主题有很多 SO 问题,尤其是这个问题,但这对我没有帮助。
和之间有歧义property_exists
,isset
所以在问我的问题之前,我要指出:
property_exists
property_exists检查对象是否包含属性而不查看其值,它只查看其可见性。
所以在下面的例子中:
<?php
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检查属性中是否存在值,如果值等于 ,则考虑 is 未设置false
andnull
。
<?php
$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
对神奇添加的属性的行为
一个属性可以存在一个null
值,所以我不能使用__isset
魔术方法来知道一个属性是否存在。我也不能property_exists
使用魔法方法添加属性。
这是一个示例,但这只是一个示例,因为在我的应用程序中,神奇地设置的属性存储在 object 之外。
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
所以这是我的问题:
有没有神奇的方法或 SPL 接口来实现
property_exist
神奇添加的属性?