2011-12-09 2 views
10

내가 젠드 PHP 학습 가이드에서이 질문을 가지고 적절한 설명을 찾을 수는 ...PHP 마법 방법 예

<?php 
    class Magic { 
     public $a = "A"; 
     protected $b = array("a"=>"A", "b"=>"B", "c"=>"C"); 
     protected $c = array(1,2,3); 

     public function __get($v) { 
      echo "$v,"; 
      return $this->b[$v]; 
     } 
     public function __set($var, $val) { 
      echo "$var: $val,"; 
      $this->$var = $val; 
     } 
    } 

    $m = new Magic(); 
    echo $m->a.",".$m->b.",".$m->c.","; 
    $m->c = "CC"; 
    echo $m->a.",".$m->b.",".$m->c; 
?> 

가이드에 따르면, 해결책은 "b,c,A,B,C,c: CC,b,c,A,B,C"한다. 나는 이유를 알아낼 수 없다. 어쩌면 그렇게 할 수 있을까? __get() 전화 echo는 일부 데이터는 클래스의 echo 외부 전에 출력되는

+0

제공 한 코드는 "b, c, A, B, Cmc : CC, b, c, A, B, C"를 출력합니다 ([this proof] (http://codepad.org/) 참조) ez1rSs63)). 가이드의 오타 또는 정확한 내용입니까? – Tadeck

+0

당신이 맞습니다 - 작은 오타. 그것은 지금 정확합니다. http://codepad.org/H91fpj8q –

답변

14

때문에 ... 내 의도는 $ M-의 첫 번째 호출>은 "은"을 결과를 초래할 것입니다, 그러나 그것은 분명히 잘못된 것입니다 호출됩니다. echo와 첫 번째 라인을 통해 스테핑

, 이것은이 실행되는 방식이다

이 시점에서
$m->a "A" is concatenated 
","  "," is concatenated 
$m->b "b," is echoed, "B" is concatenated 
","  "," is concatenated 
$m->c "c," is echoed, "C" is concatenated 
"m"  "," is concatenated 

, b,c, 이미 echo 에드 왔으며, A,B,Cm의 값 문자열은 이제 표시됩니다.

+0

옙, 그게 전부입니다 - 오늘 끝났습니다. 완전히 그 것을 놓쳤습니다! –

+0

+1 훨씬 더 나은 설명. –

+0

굉장! 고마워. 그러나, 그 중 하나가 시험에 올 경우 ... :) 모두에게 감사! –