вложенные функции в php генерируют исключение, когда внешний вызов вызывается более одного раза

не предполагайте, что у меня есть следующее

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, чтобы сделать вышеприведенный код, но на самом деле существует несколько сценариев, где вы действительно должны делать что-то подобное.