Вопрос по замыканиям и unset/NULL

Пытаюсь понять как работают замыкания с передачей переменной по ссылке, а также удаление этой переменной через unset и присвоение NULL.

Вот код:

    $message = 'привет';

    $example = function () use (&$message) {
        var_dump($message);
    };

    $message = 'мир111';
    $example(); // 'мир111'

    $message = NULL;
    $example(); // 'NULL'

    unset($message);
    $example(); // 'NULL'

    $message = 'мир222';
    $example(); // 'NULL'

    var_dump('----------------');

    $message = 'привет';

    $example = function () use (&$message) {
        var_dump($message);
    };

    $message = 'мир111';
    $example(); // 'мир111'

    $message = NULL;
    $example(); // 'NULL'

    // unset($message);
    // $example(); // 'NULL'

    $message = 'мир222';
    $example(); // 'мир222'

    var_dump('----------------');

    $message = 'привет';

    $example = function () use (&$message) {
        var_dump($message);
    };
    $message = 'мир111';
    $example(); // 'мир111'

    // $message = NULL;
    // $example(); // 'NULL'

    unset($message);
    $example(); // 'мир111'

    $message = 'мир222';
    $example(); // 'мир111'

В этом коде я использую замыкание для вывода значения переменной $message. И вот что происходит (вывод указан в комментариях кода):

  1. В первом случае после присваивания NULL, а затем вызова unset на переменной - на экран будет выведен NULL даже после присваивания нового значения.
  2. Во втором случае, если мы используем только присваивание NULL, то с переменной ничего не происходит, ей присваивается значение 'мир222', которое и выводится на экран.
  3. В третьем случае мы не присваиваем NULL, а сразу вызываем unset. Но переменная ведет себя очень странно - она игнорирует следующее присваивание и выводит то значение, которое было до вызова unset.

Внимание, вопрос: Почему в первом случае переменная выводит NULL вместо 'мир222'? И почему в третьем случае выводит старое значение, а не NULL или 'мир222'?


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

Автор решения: Вадим Александру

после unset у вас по факту совершенно другая переменная, просто с таким же названием. Вы передаете значение по ссылке, замыкание создает алиас для данной переменной, после unset данный алиас уже ведет к null несмотря на то, что у вас есть другая переменная с таким же именем.

→ Ссылка