2

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

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

public function __construct(  ){        

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

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

}

现在在我的页面中,我可以使用 $this->user 并且一切正常。如果用户已登录,则返回用户对象。在我的用户类中,我有一个神奇的 __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 函数不起作用?

4

2 回答 2

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;
    }       
}
于 2013-05-01T20:39:03.043 回答
1

$this->oAlbums是不是还没有摆在你面前__get()呢?尝试:

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

......它可能会告诉一些不同的东西。你__isset()应该在我看来只是 return trueempty()实际上__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
于 2013-05-01T20:53:10.273 回答