Ziarno
Ziarno

Reputation: 7562

Magic methods __get and __set - example from ZCE

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,

Upvotes: 1

Views: 521

Answers (1)

bwoebi
bwoebi

Reputation: 23777

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")

Upvotes: 3

Related Questions