2010-05-15 1 views
0

기본적으로 세션을 사용하여 직접 작업하지 않고도 전체 사이트에서 사용해야하는 데이터를 신속하게 가져오고 저장할 수 있도록 세션을 사용하여 세션을 사용하는 Variables라는 클래스를 만듭니다.PHP의 Magic __set 작업을 자연스러운 변수로 만들려면 어떻게해야합니까?

는 지금, 내 코드는 다음과 같습니다 :

그러나
<?php 
    class Variables 
    { 
      public function __construct() 
      { 
        if(session_id() === "") 
        { 
          session_start(); 
        } 
      } 
      public function __set($name,$value) 
      { 
        $_SESSION["Variables"][$name] = $value; 
      } 
      public function __get($name) 
      { 
        return $_SESSION["Variables"][$name]; 
      } 
      public function __isset($name) 
      { 
        return isset($_SESSION["Variables"][$name]); 
      } 
    } 

, 내가 예를 들어, 천연 변수처럼 사용하려고하면 ...

$tpl = new Variables; 
$tpl->test[2] = Moo; 
echo($tpl->test[2]); 

나는 "그만 둘 "Moo"대신 "o"를 사용하여 테스트를 "Moo"로 설정하므로 배열을 완전히 무시합니다. 나는 그걸로 해결할 수 있다는 것을 알고있다.

$tpl->test = array("Test","Test","Moo"); 
echo($tpl->test[2]); 

그러나 나는 그것이 자연의 변수 인 것처럼 그것을 사용할 수 있기를 바란다. 이것이 가능한가?

+2

$ _SESSION 변수를 직접 사용할 수도 있습니다. 어쨌든, 나는 그것을 얻지 못하고있다. $ tpl-> test [2] = Moo 란 무엇입니까? 하기로되어있다? Moo는 일정합니까? 문자열 인 경우 따옴표가 없습니다. – Artefacto

+0

무엇이 요점입니까? $ _SESSION은 이미 변수입니다 ... – nico

+0

@nico 미래에서 말하면, 이것은 의존성 주입과 단순한 추상화 같은 것들에 아주 좋습니다. 어떤 사람들은 Session을 객체 또는 싱글 톤으로 사용하는 것을 선호 할 수도 있습니다. – Navarr

답변

4

당신은 참조로 __get 반환을 할 수 있습니다 :

<?php 
class Variables 
{ 
     public function __construct() 
     { 
       if(session_id() === "") 
       { 
         session_start(); 
       } 
     } 
     public function __set($name,$value) 
     { 
       $_SESSION["Variables"][$name] = $value; 
     } 
     public function &__get($name) 
     { 
       return $_SESSION["Variables"][$name]; 
     } 
     public function __isset($name) 
     { 
       return isset($_SESSION["Variables"][$name]); 
     } 
} 

$tpl = new Variables; 
$tpl->test[2] = "Moo"; 
echo($tpl->test[2]); 

는 "무"를 제공합니다.

+0

참조 연산자로 __get/set을 오버로드 할 수 있다고 생각하지 않았습니다 ... – prodigitalson

+1

사실 __get을 오버로드해야합니다. 그렇지 않으면 메시지를받습니다. 오버로드 된 속성의 간접 수정 Variables :: $ test는 아무 효과가 없습니다. $ tpl-> test [2] = "Moo"를 사용할 때; 호출되고있는 실제 핸들러는 __set이 아닙니다. 그것은 __get입니다. "$ tpl에 저장하다 -> 배열을 테스트하라 (2 =>"Moo ")"라고 말하면서 "$ tpl-> 테스트 배열을 수정하여"Moo "값에 2 개의 키 맵이되도록하십시오. 이를 위해 __get 및 __get을 호출하여 참조로 반환해야합니다. __get/__ set 쌍으로이 작업을 수행 할 수 있다고 생각할 수도 있지만 가능하지 않은 이유는이 주석에 맞지 않습니다. – Artefacto