не предполагайте, что у меня есть следующее
function a(){ function b(){} } a(); //pass a(); //error
почему во втором вызове выбрано исключение, и это говорит
cannot re-declare function b()
я думал, что каждый вызов функции делает новую активную запись, что она содержит свою собственную область; как в других языках, других, что PHP, когда мы объявляем переменную в функции и называем эту функцию, все переменные являются живыми для их области видимости, почему внутренняя функция не то же самое?
Именованные функции всегда являются глобальными в PHP. Поэтому вам нужно будет проверить, была ли уже создана функция B:
function A() { if (!function_exists('B')) { function B() {} } B(); }
Другое решение – использовать анонимную функцию (это, скорее всего, будет соответствовать вашим потребностям, поскольку функция теперь хранится в переменной и, следовательно, локальна для области функций A):
function A() { $B = function() {}; $B(); }
Это происходит потому, что когда вы выполняете функцию a
она объявляет функцию b. Выполняя его снова, он вновь заявляет об этом. Вы можете исправить это, используя function_exists
function_exists.
function a(){ if(!function_exists('b')){ function b(){} } }
Но я предлагаю, вы должны объявить функцию снаружи. НЕ внутри.
Это именно то, что говорит, когда вы вызываете a()
снова, он пытается обновить b()
, объявить b()
вне a()
и вызвать b()
изнутри a()
следующим образом:
function a() { b(); } function b() {} a(); a();
Объявление функции в рамках другой функции, подобной этой, будет считаться плохой практикой в php. Если вам действительно нужна функция внутри (), вы должны создать закрытие.
function a() { $b = function() { }; }
Это потому, что вы вызываете a()
в глобальной области. Добавьте вызов функции_exists, чтобы сделать вышеприведенный код, но на самом деле существует несколько сценариев, где вы действительно должны делать что-то подобное.