-1

重複の可能性:
外部関数が複数回呼び出されると、php のネストされた関数が例外をスローする

なぜ

function foo(){
    function bar(){
    }    
}
bar(); 

存在しない関数バーで致命的なエラーを返す

その間

function foo(){
    function bar(){
    }    
}
foo(); 
foo(); 

bar() の重複宣言で致命的なエラーが発生しますか?

PHPは関数をグローバルまたは親の関数スコープで処理しますか?

4

4 に答える 4

4

関数自体は、別の関数内で定義されていたとしても、グローバル スコープで定義されます。foo()最初のケースでは、 beforebar()を呼び出さないと、bar()まだ存在しません。

function_exists()作成する前にテストできます:

function foo(){
    // Don't redefine bar() if it is already defined
    if (!function_exists("bar")) {
      function bar(){
      }    
    }
}

ただし、ネストされた関数のスコープは外側の関数に限定されないため、別の関数内で関数を定義する使用例は多少制限されます。さらに、コードにいくつかの奇妙な副作用が発生し、理解と保守が難しくなる可能性があります。本当にこれをやりたいかどうかを検討し、必要に応じてそうする理由を再考してください。探しているのがスコープの制限である場合は、名前空間またはクラス/オブジェクトがより適切に機能する可能性があります。

于 2012-08-15T19:54:39.337 に答える
2

関数は常にグローバル スコープで作成されますが、その定義が実行される場合のみです。

于 2012-08-15T19:53:35.400 に答える
0

最初の例で barは、関数で宣言されていますfoo。したがって、その定義がまだ実行されていないため、bar最初に呼び出さなければ意味がありません。foo2 番目の例では、foo2 回呼び出しているため、bar関数が 2 回宣言されています。

于 2012-08-15T19:54:26.060 に答える
0

関数「内部」は、外部関数が呼び出されたときにのみ宣言されます。

最初の例では、 を呼び出さないfoo()ため、bar()宣言されることはありません。

2 番目の例では、2 回呼び出すfoo()ため、2bar()回宣言されます。

于 2012-08-15T19:53:55.763 に答える