我对该计划的运作方式感到困惑;代码应打印A, bB
,但显示bA,B
class SampleClass {
public $a = "A";
protected $b = array ("a" => "A", "b" => "B", "c" => "C");
public function __get($v){
echo "$v";
return $this->b[$v];
}
}
$m = new SampleClass();
echo $m->a . ", " . $m->b;
答案 0 :(得分:9)
这真的很有道理。让我们考虑一下执行顺序:
在PHP可以回复您请求的字符串之前,它必须首先评估它(即$m->a . ", " . $m->b
部分)
所以在这一点上,解析器尝试解析$ m-> a和$ m-> b,它解析了第一个,但是第二个失败了,所以我们转到魔术方法。
神奇的方法回应某些东西(第一个'b),然后将自己解析为B.
现在,我们需要完成我们开始的工作(原始回声)。
那我们有什么?
将它们组合在一起?
BA,B
答案 1 :(得分:1)
这很奇怪,但它并没有做你认为它正在做的事情。
运行此代码会有所不同。
class SampleClass {
public $aaa = "A";
protected $b = array ("a"=> "A", "b" => "B", "c" => "C");
public function __get($v){
echo "$v";
return $this->b[$v];
}
}
$m = new SampleClass();
echo "[" . $m->a. ", ". $m->b. ", ". $m->c . "]";
输出是:
abc[A, B, C]
当您执行$ m-> a时,您的原始__get不会被调用,因为有一个变量' a'无论如何。它只是作为最后的手段,所以你应该写自己特定的“吸气剂”。而不是功能。