Для следующего кода я ожидал
A,b,B,c,C,c:CC,A,b,B,c,C
как выход. Но я получаю
b,c,A,B,C,c: CCb,c,A,B,C
Может кто-нибудь объяснить мне, пожалуйста, как это работает?
Вот мой код
class Magic
{
public $a = "A";
protected $b = array("a"=>"A","b"=>"B","c"=>"C");
protected $c = array(1,2,3);
public function __get($name)
{
echo "$name,";
return $this->b[$name];
}
public function __set($name, $value)
{
echo "$name: $value";
$this->$name = $value;
}
}
$m = new Magic();
echo $m->a.",".$m->b.",".$m->c.",";
$m->c = "CC";
echo $m->a.",".$m->b.",".$m->c;






Во-первых, метод __get не используется для $m->a. Магический метод используется только для получения недоступных свойств. Поскольку a является общедоступным свойством, он извлекается обычным способом.
Причина, по которой выходные данные методов __get не чередуются со значениями, заключается в том, что все значение аргумента echo вычисляется до того, как он что-либо напечатает. Так
echo $m->a.",".$m->b.",".$m->c.",";
эквивалентно
$temp = $m->a.",".$m->b.",".$m->c.",";
echo $temp;
Итак, сначала он получает значения всех трех свойств, что вызывает волшебные методы для $m->b и $m->c, которые печатают имена свойств и возвращают значения из массива $b. Затем он объединяет все возвращенные значения и, наконец, печатает этот объединенный результат.
__getили__setиспользуются только в свойствах, которые не существуют,public $aсуществует ... под словом существует я имею в виду доступный.