1
 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 Answer 1

3

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

Sign up to request clarification or add additional context in comments.

2 Comments

why are the lower case letters all before higher case?
because the string is first concatenated which needs to fetch (the echo in __set is instantly called on fetching; doesn't wait for completing the string concatenation) the values and only after reading the values, it outputs the string. (Try replacing the "." in the echo statement by ",". Then it's interpreted like if there were different echo statements.)

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.