__isset не возвращает правильный результат

Я пытаюсь связать объекты вместе, используя волшебные функции 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?


person David Ericsson    schedule 01.05.2013    source источник


Ответы (2)


__isset должен вернуть 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;
    }       
}
person hek2mgl    schedule 01.05.2013

$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
person Wrikken    schedule 01.05.2013