Магические функции PHP __get, __set порядок выполнения

Для следующего кода я ожидал

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 или __set используются только в свойствах, которые не существуют, public $a существует ... под словом существует я имею в виду доступный.
ArtisticPhoenix 28.12.2018 02:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
26
1

Ответы 1

Во-первых, метод __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. Затем он объединяет все возвращенные значения и, наконец, печатает этот объединенный результат.

Другие вопросы по теме