2011-01-20 9 views
15

関数がクラス関数内で宣言されたときに、関数内で宣言された関数のスコープが異なっているのはなぜかと思いました。例えば関数内で宣言された関数のスコープ

:これが起こる理由

function test() // global function 
{ 
    function myTest() // global function. Why? 
    { 
    print("Hello world"); 
    } 
} 

class CMyTestClass 
{ 
    public function test() // method of CMyTestClass 
    { 
    function myTest() // This declaration will be global! Why? 
    { 
     print("Hello world"); 
    } 
    } 
} 

} 

誰が私にこれを説明することはできますか? ありがとうございます。

Greetz。

+0

好奇心のために、メソッド内で関数を宣言することの利点は何ですか? –

+0

@Gordon関数が定義されるように、最初に関数を呼び出さなければなりません。 – Wiseguy

+0

@MikeB - おそらく他の理由があるかもしれませんが、このアプローチは一種の「匿名機能」の試みかもしれません。そのための正しい書式は次のとおりです:http://php.net/manual/en/functions.anonymous.php – rinogo

答えて

10

PHPでは、すべての関数は、いつ、どのように定義するにしても、常にグローバルです。 (匿名関数は部分的に例外です。)したがって、両方の関数定義はグローバルになります。

From the documentation:PHPで

すべての関数やクラスは、グローバルスコープを持っている - 彼らは、彼らが内部に定義された場合でも、 関数の外と呼ばれ、その逆のことができます。

+4

この回答に追加するには、リンクされたドキュメントにも次のように書かれています。「関数を参照する前に定義する必要はありませんただし、関数が条件付きで定義されている場合を除き...その定義は呼び出される前に処理されなければなりません。したがって、その定義が含まれる関数を最初に呼び出す必要があります。 – Wiseguy

2

あなたが別の関数内で関数を定義すると、親関数が実行されるまで、それは 存在しません。親関数に が実行されると、ネストされた関数が定義され、 関数と同様に、現在のドキュメント内のどこからでもアクセスできます。コード内に のネストされた関数がある場合は、外側の 関数を1回だけ実行できます。反復呼び出しは内部の 関数を再宣言しようとしますが、これによりエラーが発生します。

現在、すべてのphp関数はデフォルトでグローバルです。したがって、ネストされた関数はグローバルになります。次に外部関数と呼ぶ

+2

「デフォルトで」とはどういう意味ですか?私はどのように非グローバル関数を作ることができますか(非常に異なる取引である無名関数とは別に)。 – NikiC

関連する問題