Страницы

Поиск по вопросам

пятница, 10 января 2020 г.

Можно ли считать синонимом объявления этих функций?

#php


$str = 'Какая-то строка';

// Вариант со ссылкой use на переменную $str
    $foo = function ($sep) use ($str) {
    $out = $sep . $str . $sep;
    return $out;
};

// Вариант с объявлением переменной $str глобальной
$foo = function ($sep) {
    global $str;
    return $sep . $str . $sep;
};

echo $foo('~');


Результат их работы идентичный. Я так понимаю, что оператор use передаёт в область
видимости функции переменную $str. Оператор global внутри функции выполняет то же,
что и use - значит эти два объявления можно считать синонимами?
    


Ответы

Ответ 1



Вы используете анонимные функции, также известные как замыкания (closures), которые позволяют создавать функции, не имеющие определенных имен. Замыкания могут также наследовать переменные из родительской области видимости. Любая подобная переменная должна быть объявлена в конструкции use. Изменения внутри не будут отражаться на переменной из родительской области видимости, чтобы изменять переменную внутри и отражать изменения в родительскую область необходимо добавить перед началом &, тогда переменная будет передана по ссылке. $foo = function ($sep) use (&$str) { $out = $sep . $str . $sep; return $out; }; Конструкция global $a говорит о том, что переменная $а является глобальной, т. е. является синонимом глобальной $а и изменения внутри функции будут отражены в глобальную область видимости. После определения переменных через global все ссылки на любую из этих переменных будут указывать на их глобальную версию. Таким образом иструкция global создает ссылку на массив $GLOBALS, т.о. эти две записи будут эквивалентны: function test() { global $a; $а = 10; } function test() { $а = &$GLOBALS['a']; $а = 10; } Массив $GLOBALS доступен из любого места в программе — в том числе и из тела функции, и его не нужно никак дополнительно объявлять. По вашему вопросу, могу сказать, то что вы определяете функции двумя способами является совершенно одинаковым. Вы просто меняете способ передачи параметров в функцию. P.S. Чрезмерное определение глобальных переменных грозит усложнением поиска ошибок в программе. Это реальный способ довести до сумасшествия программиста, который будет потом разбирать твою программу.

Ответ 2



Думаю по коду ниже Вам должно стать понятно, что замыкания используют копии значения переменных на момент объявления (случай без &), а глобал использует ссылку на последнюю версию. Передача по ссылке в замыкание, эквиваленто использованию global

Комментариев нет:

Отправить комментарий