Php魔术方法和空

Php魔术方法和空,php,Php,具有以下代码 class test { private $name; public function __get($name){ return $name; } public function __set($name,$value){ $this->name = $value; } } $obj = new test(); $obj->a = 2; if (!empty($obj->a)) { e

具有以下代码

class test {
    private $name;
    public function __get($name){
        return $name;
    }
    public function __set($name,$value){
        $this->name = $value;
    }
}
$obj = new test();
$obj->a = 2;

if (!empty($obj->a)) {
    echo 'not empty';
}
这是呼叫isset。但它没有被定义,所以它总是返回空的。检查非空属性的最佳方法是什么


更新:更改类不是解决方案,因为它是第三方组件,必须保持完整。

当与变量以外的任何对象一起使用时,它没有意义;ie empty(addslashes($name))没有意义,因为它将被除变量以外的任何变量作为值为FALSE的变量进行检查

在您的情况下,应使用类型转换:

如果((bool)$obj->a){ 回声“不是空的”; }改变

public function __set($name,$value){
        $this->name = $value;
    }
 To

public function __set($name,$value){
        $this->$name = $value;
    }

然后再试试

如果您不能更改类,我认为唯一可能的解决方法是使用临时变量

$obj->a = 2;

$test = $obj->a; 

if (!empty($test)) {
    echo 'not empty';
}

我知道我在这里参加聚会已经很晚了,但是我在这里发表这篇文章是为了启发任何可能偶然发现这个问题的人

首先,我认为测试类是错误的,如果第三方组件真的是这样做的,我会把它扔掉,因为它是垃圾。是否确实希望所有属性名称在内部映射到单个属性“名称”,从而相互覆盖?是否确实要将所有属性名作为属性值返回?代码应如下所示:

class test {
    public function __get($name){
        return $this->$name;
    }
    public function __set($name,$value){
        $this->$name = $value;
    }
}
其次,您可以更改类,即使它必须保持不变。这就是继承的意义。这是最新的。如果函数不正确,只需像这样扩展测试以更正它们:

class test {
    private $name;
    public function __get($name){
        return $name;
    }
    public function __set($name,$value){
        $this->name = $value;
    }
}

class my_test extends test
{
    public function __get($name)
    {
        return $this->$name;
    }

    public function __set($name,$value){
        $this->$name = $value;
    }
}
您不需要定义
\uuu isset()
,因为更正后的代码将执行它应该执行的操作,但是如果您这样做了,您也可以在这里执行

现在,下面将执行它应该执行的操作(注意类名的更改):


为什么不定义一个
\uu isset()
?我做了一个更新。无法更改类。
$obj = new my_test();
$obj->a = 2;

if (!empty($obj->a)) {
    echo 'not empty';
}