__isset没有返回正确的结果

时间:2013-05-01 20:36:32

标签: php magic-methods

我试图使用神奇的php函数将对象链接在一起。

我有一个名为page的抽象类,我网站中的每个页面都扩展了这个类。 在这个抽象类构造函数中,我尝试获取这样的用户对象:

public function __construct(  ){        

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

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

}

现在在我的页面中,我可以使用$ this->用户,它运行良好。如果用户已登录,则返回用户对象。 在我的用户类中,我有一个魔法__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';

在我的页面中,它仍然回显了字符串..

为什么__isset功能不起作用?

2 个答案:

答案 0 :(得分: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;
    }       
}

答案 1 :(得分: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