なぜ
function foo(){
function bar(){
}
}
bar();
存在しない関数バーで致命的なエラーを返す
その間
function foo(){
function bar(){
}
}
foo();
foo();
bar() の重複宣言で致命的なエラーが発生しますか?
PHPは関数をグローバルまたは親の関数スコープで処理しますか?
なぜ
function foo(){
function bar(){
}
}
bar();
存在しない関数バーで致命的なエラーを返す
その間
function foo(){
function bar(){
}
}
foo();
foo();
bar() の重複宣言で致命的なエラーが発生しますか?
PHPは関数をグローバルまたは親の関数スコープで処理しますか?
関数自体は、別の関数内で定義されていたとしても、グローバル スコープで定義されます。foo()
最初のケースでは、 beforebar()
を呼び出さないと、bar()
まだ存在しません。
function_exists()
作成する前にテストできます:
function foo(){
// Don't redefine bar() if it is already defined
if (!function_exists("bar")) {
function bar(){
}
}
}
ただし、ネストされた関数のスコープは外側の関数に限定されないため、別の関数内で関数を定義する使用例は多少制限されます。さらに、コードにいくつかの奇妙な副作用が発生し、理解と保守が難しくなる可能性があります。本当にこれをやりたいかどうかを検討し、必要に応じてそうする理由を再考してください。探しているのがスコープの制限である場合は、名前空間またはクラス/オブジェクトがより適切に機能する可能性があります。
関数は常にグローバル スコープで作成されますが、その定義が実行される場合のみです。
最初の例で bar
は、関数で宣言されていますfoo
。したがって、その定義がまだ実行されていないため、bar
最初に呼び出さなければ意味がありません。foo
2 番目の例では、foo
2 回呼び出しているため、bar
関数が 2 回宣言されています。
関数「内部」は、外部関数が呼び出されたときにのみ宣言されます。
最初の例では、 を呼び出さないfoo()
ため、bar()
宣言されることはありません。
2 番目の例では、2 回呼び出すfoo()
ため、2bar()
回宣言されます。