2017-03-18 8 views
1

PHPは通常、ネストされた関数を使用前に定義する必要があるようです。しかし、requireで動的に構築されたコードには同じ制限がありません。誰もなぜ不一致を説明することができますか?これらのPHPネストされた関数の例はなぜ異なって動作しますか?

編集:明確にするために、私が理解したいことは次のとおりです。例2は、例1のように失敗するのではなく、なぜ機能しますか?

例1

これはファイルnested1.phpの内容である場合:inner()機能を移動する場合は、しかし、

PHP Fatal error: Call to undefined function inner() in nested1.php on line 3

php nested1.phpリターンでこれを実行する

<?php 
function outer() { 
    inner(); 
    function inner() { 
     print "Hello world.\n"; 
    } 
} 
outer(); 
?> 

次のような関数定義の下を呼び出します。

<?php 
function outer() { 
    function inner() { 
     print "Hello world.\n"; 
    } 
    inner(); 
} 
outer(); 
?> 

と再び実行あなたが得る:

Hello world.

例2

これはnested2.phpの内容である場合:

<?php 
function outer() { 
    require "inner.php"; 
} 
outer(); 
?> 

そして、これはinner.phpの内容です:

<?php 
    inner(); 
    function inner() { 
     print "Hello world.\n"; 
    } 
?> 

php nested2.phpリターンでこれを実行する:

Hello world.

+0

あなたは 'nested2を実行しています。 php'と 'nested1.php'とは別に? – nosthertus

答えて

2

例1: PHP does not support nested functions. It only supports inner functions.Nested function reference

Inner function reference

<?php 
function outer() { 
    inner(); 
    function inner() { 
     print "Hello world.\n"; 
    } 
} 
outer(); 

例2:あなたの最初の例でIn this function you are just requiring file which includes and evaluates the scripts.Reference

<?php 
function outer() { 
    require "inner.php"; 
} 
outer(); 
?> 

<?php 
    inner(); 
    function inner() { 
     print "Hello world.\n"; 
    } 
?> 
+0

私は同意しません。 PHPは入れ子関数をサポートしています。明確にするために私の質問を編集しました。 – Kruthers

+0

@KruthersあなたのPHPコードの最初の部分によると、定義の前に関数を呼び出しています。 PHPがネストされた関数をサポートしていればアクセス可能です。しかし、2番目の部分では、その定義の後に関数を呼び出すことができます。これが「内的機能」の状態です。ネストされた関数と内部関数の参照で私の答えを更新しています –

+0

@SahilGulatiありがとうございました。したがって、「ネストされた」という用語は、PHPがこの場合実際には行っていない特定のことを意味します。しかし、あなたが提供したリンクは、私が例2が異なって動作する理由を理解する助けにはなりません。たとえば、inner.phpは、require文の前にouter()で定義された変数にアクセスできます。したがって、PHPはインポートされるまでinner.phpを評価することができません。例1のように動作するはずです(私の僅かな理解では...) – Kruthers

0

は、あなたが別の関数内に新しい関数を定義しようとしているが、ネストされた関数は、PHPで許可されていません。このようなことは、うまくいくでしょう:

<?php 
function outer() { 
    inner(); 
} 
outer(); 
function inner() { 
    print "Hello world.\n"; 
} 
?> 

2番目の例では、ファイルを含めています。 inner.phpでネストされた関数を使用していないので、コードは期待通りに機能します。

+0

PHPは入れ子関数をサポートしています。編集された質問を参照してください。 – Kruthers

2

outer()関数が初めて呼び出されたときに、その中のinner()機能は、グローバルスコープで宣言されます。outer()への2回目の呼び出しはinner()関数を宣言再度しようとしたので、

Fatal error: Cannot redeclare inner() 

function outer() { 
    function inner() { 
     print "Hello world.\n"; 
    } 
    inner(); 
} 
outer(); 
outer();//Second call 

は、このように次のエラーを取得します。この問題を回避するためには

は、次のような無名関数の宣言を使用する必要があります。

function outer() { 

    $inner = function() { 
     print "Hello world.\n"; 
    }; 

    $inner(); 
} 
outer(); 
outer(); 

この場合のみ、ローカル機能「外」のスコープで利用可能な$inner

+0

情報をありがとうが、これは私が尋ねた質問に答えるものではありません。 – Kruthers

関連する問題