4

私が次のものを持っていると仮定しないでください

function a(){
  function b(){}
}
a(); //pass
a(); //error

2番目の呼び出しで例外がスローされ、それが言う理由

cannot re-declare  function b()

関数呼び出しごとに、独自のスコープを含む新しいアクティブなレコードが作成されると思いました。関数で変数を宣言し、その関数を呼び出すと、PHP 以外の他の言語のように、すべての変数はそのスコープで有効ですが、内部関数が同じではないのはなぜですか?

4

5 に答える 5

7

PHP では、名前付き関数は常にグローバルです。したがって、関数 B が既に作成されているかどうかを確認する必要があります。

function A() {
    if (!function_exists('B')) {
        function B() {}
    }
    B();
}

別の解決策は、無名関数を使用することです (関数が変数に格納され、したがって A の関数スコープに対してローカルであるため、これはニーズに合う可能性が高くなります)。

function A() {
    $B = function() {};
    $B();
}
于 2012-08-15T10:54:21.260 に答える
4

これは、関数を実行するaと、関数 b が宣言されるためです。再度実行すると、再宣言されます。関数を使用してこれを修正できますfunction_exists

function a(){
  if(!function_exists('b')){
    function b(){}
  }
}

しかし、私が提案するのは、関数を外部で宣言する必要があるということです。内部ではありません。

于 2012-08-15T10:53:07.553 に答える
1

それはまさに言っていることです。a()もう一度呼び出すと、次のように再宣言し、外側でb()宣言し、内側から呼び出します。b()a()b()a()

function a() {
  b();
}

function b() {}

a();
a();
于 2012-08-15T10:53:30.027 に答える
1

そのような別の関数内で関数を宣言することは、php では悪い習慣と見なされます。a() 内に関数が本当に必要な場合は、クロージャーを作成する必要があります。

function a() {
  $b = function() {

  };
}
于 2012-08-15T11:13:37.217 に答える
0

a()これは、グローバル スコープで呼び出しているためです。呼び出しを追加しfunction_existsて上記のコードを機能させますが、実際には、このようなことを実際に行う必要があるシナリオはほとんどありません。

于 2012-08-15T10:53:57.127 に答える