2010-09-17 135 views
2

具有下列代码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方组件,它必须保持不变。

+2

为什么不定义'__isset(? – 2010-09-17 12:32:25

+1

我做了一个更新,不能改班。 – danidacar 2010-09-17 13:39:11

回答

3

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

$obj->a = 2; 

$test = $obj->a; 

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

我很害怕这个。 – danidacar 2010-09-17 13:47:47

0

与其他变量一起使用时没有意义;即空(addslashes($ name))没有意义,因为它将被除变量之外的任何其他值检查为值为FALSE的变量。

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

IF((布尔)$ obj->一){ 回声 '不空'; }

+0

如果包含空字符串,则不起作用。 – danidacar 2010-09-17 13:40:34

0

变化

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

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

然后尝试

+0

我做了更新,不能改班。 – danidacar 2010-09-17 13:39:59

1

我知道我是很晚才到这里聚会,但我张贴此为edificationof任谁也碰到这个问题绊倒。首先,我认为测试类是错误的,如果这真的是第三方组件的功能,那么我会挑选它,因为它是垃圾。你真的想要所有的属性名称内部映射到单个属性的'名称',从而相互覆盖?你真的希望所有的属性名称都作为属性值返回吗?该代码应该是这样的:

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