Magic methods __get and __set - example from ZCE

2019-03-01 05:39发布

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

This is an example question (not from an actual exam) for ZCE. Can someone please explain to me... what's going on here, and why the answer is... not at all what I expected?

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

1条回答
beautiful°
2楼-- · 2019-03-01 05:45

then… what do you expect?

It calls __get/__set if you don't have from your actual scope the rights to access the property / the property doesn't exist.

So $m->a gets directly "A"; $m->b and $m->c call first __get("b") and __get("c") (return "B" and "C" after echoing "b, c, ")

The same is for $m->c = "CC";: it calls __set("c", "CC") as $c is a protected (non-accessible) property. (sets $m->c to "CC" after echoing "c: CC")

查看更多
登录 后发表回答