2013-03-11 17 views
12

PHPエンジンによる関数宣言の解釈の順序が不思議です。私はなぜsomethimes PHPが未定義関数の致命的なエラーとsomethimesインタプリタが問題なく機能を参照してコールを示すのか分からない。PHPワークフロー - 関数の実行順序

のは、私のコードがあるとしましょう:

echo theRest(4,3); 

function theRest($a, $b) 
{ 
    return $a % $b; 
} 

は、その関数が呼び出し後に宣言され、これが適切に機能を参照してください。これは、PHPが解釈前に全ファイルを読み込むことを意味しますか?

別の例:私は致命的なエラーを取得しています。ここ

function theRest($a, $b) 
{ 
    return $a % $b; 
} 

echo theRest(4,3); 

include('test2.php'); 

test2.php:未定義の関数theRest()を呼び出します。何故ですか?

+0

。 (私は1つを持っています)誰かが答えを提供することもできますことを願っています。 –

+0

この[質問](http://stackoverflow.com/questions/5762017/php-include-not-working-function-function-not-being-included)を見ても同じような問題がありますか?ちなみに、 'include( 'test2.php');'行 - 前関数?あなたが知っている、試してみると: –

+0

これは[YourLanguageSucks](https://wiki.theory.org/YourLanguageSucks#PHP_sucks_because :) wikiページ –

答えて

6

means that PHP is reading whole file before interpretation?

はい、PHPは一度に1ファイルを解析します。また、 "include"はコンパイル時に起こるものではなく、include行に達するとすぐにインクルードされたファイルが解析されます。一方、関数定義は命令ではなく、制御構造内に配置されている場合は以外ののコンパイル時に処理されます。これは、なぜ、次の作品である。

if (!function_exists('ucwords')) { 
    function ucwords($str) { 
     //... 
    } 
} 

ので、制御構造の外存在を解析されたファイル内のすべての関数やクラス定義がすぐに利用可能です。このコードで

7

PHPはファイルを読み込むと、バイトコード(コンパイル時)にコンパイルして実行します(実行時/実行時)。

無条件の関数宣言はコンパイル時に読み込まれるため、コードが実行されるときに関数がすでにわかっています。

実行時にインクルードされるため、インクルードファイルに定義されている関数は、include()自体が実行される前に使用できません。コンパイル時にインクルードすることはできません。引数は動的(例:include $path_to_file;)で、コードによって変更される可能性があるinclude_path設定に依存するためです。

The documentationはそのことについて非常に明確である:

Functions need not be defined before they are referenced, except when a function is conditionally defined as shown in the two examples below.

include()を使用する場合は、あなたの関数は、条件付きで定義された事実上のである(例えば、include "foo.php";include_path設定に応じて、1つのファイルまたはその他を含めることができます)。

+0

に言及されました。ありがとうございました。私は、それが存在しない処理時間を絞るために条件文の下と外で "無条件"関数をもう移動しないことを意味すると思います。 –

0

echo theRest(4,3); 

function theRest($a, $b) 
{ 
    return $a % $b; 
} 

全体が最初にコンパイルされると、あなたのコードが実行されます。しかし、このコードで:

echo theRest(4,3); 

include('test2.php'); 

include文自体はコンパイルが、コードが実行のそのポイントに到達するまで実行されません。それは修正を参照していますとき

ポイントの前includeを置くこと:最初のものは私のマシン上で仕事をしたので、私の以前の記事を削除した

include('test2.php'); 

echo theRest(4,3);