2011-12-09 63 views
10

我从Zend 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”。我无法弄清楚为什么 - 也许你会这样做?我的本意是,$间的第一个电话>一会导致产生“一”,但显然是错误的...

+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

由于__get()电话echo,一些数据在echo外类的输出前被调用。

通过与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

太棒了!非常感谢。但是,如果那个出现在考试中... :) 感谢你们! –