对于以下代码,我期望
A,b,B,c,C,c:CC,A,b,B,c,C
作为输出。但是我得到
b,c,A,B,C,c:CCb,c,A,B,C
有人可以请我解释一下,它是如何工作的吗?
这是我的代码
class Magic
{
public $a = "A";
protected $b = array("a"=>"A","b"=>"B","c"=>"C");
protected $c = array(1,2,3);
public function __get($name)
{
echo "$name,";
return $this->b[$name];
}
public function __set($name, $value)
{
echo "$name: $value";
$this->$name = $value;
}
}
$m = new Magic();
echo $m->a.",".$m->b.",".$m->c.",";
$m->c = "CC";
echo $m->a.",".$m->b.",".$m->c;
答案 0 :(得分:2)
首先,__get
不使用$m->a
方法。 magic方法仅用于获取不可访问的属性。由于a
是公共财产,因此可以按常规方式检索它。
__get
方法的输出与值不交替的原因是,echo
参数的整个值是在打印任何内容之前计算出来的。所以
echo $m->a.",".$m->b.",".$m->c.",";
等同于
$temp = $m->a.",".$m->b.",".$m->c.",";
echo $temp;
因此,首先获取所有3个属性的值,这将调用$m->b
和$m->c
的魔术方法,这些方法将打印属性名称并从$b
数组返回值。然后将所有返回的值连接起来,最后打印出此连接的结果。