2013-05-01 219 views
2

我试图使用魔术PHP函数将对象链接在一起。__isset不返回正确的结果

我有一个称为页面的抽象类,并且我网站中的每个页面都扩展了这个类。 在这种抽象类的构造函数我试图让用户对象是这样的:

public function __construct(){   

    $user = new user(); 
    $this->user = $user->getIdentity(); 

    $this->getHeader(); 
    $this->switchAction(); 
    $this->getFooter(); 

} 

现在,在我的网页,我可以使用$这 - >用户,它工作一切正常。如果用户登录给我回的用户对象 在我的用户类,我有一个神奇的__get & __isset功能:

public function __get ($name){   
      switch ($name){ 
      case 'oAlbums': 
       return $this->oAlbums = album::get_ar_obj($arWhere = array('user_id' => $this->id)); 
      break; 

    public function __isset ($name){ 
     switch($name){ 
      case 'oAlbums': 
       echo 'magic isset called, trying to call '. $name . '<br />'; 
       return isset($this->$name); 
      break; 
     }  
    } 

因此,当在一个页面中,我要检查,如果用户有任何全部通过致电$this->user->oAlbums。 如预期的那样,这将返回一个包含所有专辑对象的数组。但是,当我在我的网页做

if(empty($this->user->oAlbums)) 
    echo 'still give smepty'; 

,它仍然Echo的字符串了..

为什么不工作的__isset功能?

回答

3

__isset应返回TRUEFALSE。如果变量存在,则为TRUE ,值为,否则为FALSE。您实际上正在返回$this->name的值。你应该只返回is_null($this->name)。你的代码更改为:

public function __get ($name){   
    switch ($name){ 
     case 'oAlbums': 
      return $this->oAlbums = album::get_ar_obj($arWhere = array('user_id' => $this->id)); 
     break; 
    } 
} 

public function __isset ($name){ 
    switch($name){ 
     case 'oAlbums': 
      echo 'magic isset called, trying to call '. $name . '<br />'; 
      return !is_null($this->$name); 
      break; 

     default: 
      return FALSE; 
    }  
} 
+0

谢谢!!像魅力一样工作 – 2013-05-01 21:03:17

1

$this->oAlbums尚未设置之前,你__get()它可能?尝试:

$something = $this->user->oAlbums; 
if(empty($this->user->oAlbums)) ... 

...它可能会告诉不同的东西。您的__isset()应该在我看来只是返回true,使得empty()实际上__get()的价值。考虑这个差异:

<?php 

class foo { 
     function __get($name){ 
       return $this->$name = range(1,3); 
     } 
     function __isset($name){ 
       return isset($this->$name); 
     } 
} 

class bar { 
     protected $whatever = array(); 
     function __get($name){ 
       return $this->$name = range(1,3); 
     } 
     function __isset($name){ 
       return isset($this->$name); 
     } 
} 
class foz { 
     function __get($name){ 
       return $this->$name = range(1,3); 
     } 
     function __isset($name){ 
       return true; 
     } 
} 

$foo = new foo(); 
var_dump(empty($foo->whatever));//true 
$void = $foo->whatever; 
var_dump(empty($foo->whatever));//false 

$bar = new bar(); 
var_dump(empty($bar->whatever));//false 

$foz = new foz(); 
var_dump(empty($foz->whatever));//false