PHP魔术函数__get,__ set执行顺序

时间:2018-12-28 01:16:04

标签: php

对于以下代码,我期望

  

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;

1 个答案:

答案 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数组返回值。然后将所有返回的值连接起来,最后打印出此连接的结果。