Не изменяется глобальная переменная PHP

Подскажите, почему глобальная переменная a не изменяется, и можно ли как-то изменить ее в данной конструкции, когда вызов идет внутри анонимной функции.

$a = 1;

$b = function() use ($a) {  

    function c()
    {
        global $a;
        $a++;
    }

    echo($a . '</br>');
    c();
    echo($a . '</br>');
};

$b();

Ответы (1 шт):

Автор решения: teran

вы создаете анонимную функцию и наследуете в ней переменную из глобальной области. В вашем случае, когда вы ее пытаетесь изменить, создается копия. Чтобы изменить оригинал наследовать надо по ссылке.

$b = function() use (&$a) {  

апд.
вообще дело выглядит несколько иначе. функция c в реальности изменяет значение глобальной $a. Вы можете в этом убедиться, если вызовите как и ранее свою $b() а потом следом c() (вы объявляете ее глобально во время вызова анонимки). Вы увидите, что будет выведено 1,1,3.
А вот echo $a у вас выводит захваченную копию по значению, поэтому она не видит изменений. Так что в данном конкретном случае, чтобы видеть изменения надо наследовать ее по ссылке. Повторюсь "чтобы видеть", а не "чтобы менять", ибо все меняется.

→ Ссылка