2013-05-01 4 views
2

임 매직 PHP 함수를 사용하여 개체를 좀더 연결하려고합니다.__isset 올바른 결과를 반환하지 않습니다

나는 페이지라는 추상 클래스를 가지고 있으며, 내 웹 사이트의 모든 페이지가이 클래스를 확장합니다. 이 추상 클래스 생성자에서 는이 같은 사용자 개체를 얻을려고 :

public function __construct(){   

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

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

} 

지금 내 페이지에 내가 $ this-을 사용할 수 있습니다> 사용자와 그 모든 잘 작동합니다. . 그래서

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; 
     }  
    } 

페이지에서, 나는 사용자가 하나를 가지고 있는지 확인하려면 : 사용자가 로그인되어있는 경우 나 다시에게 사용자 개체를 제공합니다 내 사용자 클래스에서, 나는 마법이 & __isset 기능을 __get이 앨범 번호는 $this->user->oAlbums입니다. 예상대로 모든 앨범 개체가 포함 된 배열을 반환합니다. 난 내 페이지에

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

을 할 때, 그것은 여전히 ​​에코

가 왜 __isset 기능이 작동하지 않습니다 밖으로 문자열 ..입니까?

답변

3

__issetTRUE 또는 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 
관련 문제