Магические методы __get и __set – пример из ZCE

 класс Магия {
     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, 

то … чего вы ожидаете?

Он вызывает __get / __set если у вас нет в вашей реальной области прав доступа к собственности / свойство не существует.

Таким образом, $m->a получает непосредственно «A»; $m->b и $m->c сначала вызовите __get("b") и __get("c") (верните «B» и «C» после эха «b, c»)

То же самое и для $m->c = "CC"; : он вызывает __set("c", "CC") поскольку $c является защищенным (не доступным) свойством. (задает $ m-> c в "CC" после эха "c: CC")