2013-05-01 2 views
2

Я пытаюсь связать объекты вместе, используя магические функции php.__isset не возвращает правильный результат

У меня есть абстрактный класс, называемый страницей, и каждая страница моего сайта расширяет этот класс. В этом абстрактном конструкторе класса я стараюсь, чтобы получить объект пользователя, как это:

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 не работает?

ответ

3

__isset должен вернуть TRUE или FALSE. 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

Спасибо! Работает как шарм –

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 
Смежные вопросы