魔术方法__get和__set - 来自ZCE的例子

时间:2013-04-08 19:17:25

标签: php magic-methods

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.",";

这是ZCE的一个示例问题(不是来自实际考试)。有人可以向我解释......这里发生了什么,为什么答案是......根本不是我所期待的?

b, c, A, B, C,c: CC,b, c, A, B, C,

1 个答案:

答案 0 :(得分:3)

那么......你期待什么?

如果您没有实际范围,则会调用__get / __set来访问该属性/该属性的权限。

所以$m->a直接获得“A”; $m->b$m->c首先调用__get("b")__get("c")(在回显“b,c”后返回“B”和“C”)

同样适用于$m->c = "CC";:它调用__set("c", "CC"),因为$c是受保护(不可访问)的属性。 (在回显“c:CC”后将$ m-> c设置为“CC”)