Php Magic方法和空

时间:2010-09-17 12:29:45

标签: 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)) {
    echo 'not empty';
}

这是调用__isset。但这没有被定义,所以它总是返回空。检查非空房产的最佳方法是什么?

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

4 个答案:

答案 0 :(得分:3)

如果您无法更改课程,我认为唯一可行的解​​决方法是使用临时变量。

$obj->a = 2;

$test = $obj->a; 

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

答案 1 :(得分:1)

我知道我在这里参加派对的时间已经很晚了,不过我发布这篇文章是因为任何可能偶然发现这个问题的人都会对此进行启发。

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

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

其次,您可以更改课程,即使它必须保持完整。这是继承的重点。这是open-closed principle。如果函数不正确,只需像这样扩展测试来纠正它们:

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;
    }
}

您不需要定义__isset(),因为更正后的代码会执行它的目的,但如果您这样做,也可以在此处执行此操作。

现在,以下内容将执行它应该执行的操作(请注意类名称的更改):

$obj = new my_test();
$obj->a = 2;

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

答案 2 :(得分:0)

与变量以外的任何东西一起使用时没有意义; ie empty(addslashes($ name))没有意义,因为除了变量以外的任何东西都会检查它是一个值为FALSE的变量。

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

if((bool)$ obj-> a){     回声'不空'; }

答案 3 :(得分:0)

更改

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

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

然后尝试