require() と include() には多くの類似点といくつかの相違点があります。それらの違いを理解することが重要です。理解していないと間違いを犯しやすくなります。
require() ステートメントは、C 言語の include() ステートメントと同様に、ステートメント自体ではなくファイルを指定するために使用されます。 PHP 構成ファイル php.ini 内の URL fopen ラッパーがオンになっている場合 (デフォルトでオンになっています)、URL を使用してファイルの場所を指定し、リモート ファイル呼び出しを行うことができます。
1 つは、require() ステートメントと include() ステートメントを使用するときに特別な注意を払うことです。つまり、インクルードされたファイルでは、プロセッサは HTML モードに従ってコンテンツを解釈し、インクルードされたコンテンツを処理した後、PHP モードに戻ります。したがって、インクルードされるファイルで PHP 構文を使用する必要がある場合は、正しい PHP 開始タグと終了タグを使用してこれらのステートメントをインクルードする必要があります。
require() と include() は php の単なる言語機能であり、関数ではありません。これらは多くの点で関数とは異なります。
例: require() に含まれるファイルには制御構造を含めることはできず、return などのステートメントは使用できません。 require() に含まれるファイルで return ステートメントを使用すると、処理エラーが発生します。
include() ステートメントとは異なり、require() ステートメントは、ステートメントが実行されるかどうかに関係なく、含まれるファイルの内容を無条件に読み取ります。したがって、異なる条件に従って異なるファイルをインクルードする場合は、include() ステートメントを使用する必要があります。もちろん、require() の位置にあるステートメントが実行されない場合、require() に含まれるファイル内のステートメントも実行されません。require() は、ループ本体内の異なる条件に基づいて異なるファイルを含めることはできません。 require() ステートメントは、ステートメント自体を置き換えるために初めて実行されるときにのみ、ステートメントに含まれるファイルの内容を呼び出します。再度実行されるときは、最初に含まれるステートメントのみが実行されます。ただし、 include() ステートメントでは、ループ本体にさまざまなファイルを含めることができます。
require() ステートメント内の変数は、require() ステートメントの場所にある変数スコープを継承します。 require() ステートメントの場所でアクセスできるすべての変数は、require() ステートメントに含まれるファイル内でアクセスできます。 require() ステートメントが関数内にある場合、インクルードされたファイル内のステートメントは関数内で定義されているのと同じです。
require() ステートメントは、PHP プログラムが実行される前に require によって参照されるファイルを読み取るため、通常、require はプログラムの先頭に置かれます。したがって、require ステートメントは少し強力であるという事実に特別な注意を払う必要があります。プログラムが参照ファイルを本当に必要とするかどうかに関係なく、require ステートメントを使用する限り、参照ファイルが含まれてしまいます。この関数を使用して条件制御ステートメントにインクルードすると、条件が true でなくても、参照されたファイルがインクルードされます。ゾンビが形成されると、操作中に目に見える影響はありませんが、明らかに負担が増加しますので、特に注意してください。 require ステートメントを使用してインクルード エラーが発生した場合、プログラムはエラー メッセージを出力して実行を停止します。 !
require() ステートメントにファイルの URL を宣言することによってリモート ファイルが含まれており、リモート サーバーが PHP コードに従ってファイルを解釈する場合、ローカル PHP ファイルに含まれるコンテンツはリモート サーバーでの処理の結果です。例:
リーリー
もともと php3.0 では、require() にインクルードされたファイルは return ステートメントを使用できますが、条件として、return ステートメントは {} 内に出現できず、インクルードされたファイルのグローバル スコープ内に出現する必要があります。この require() の機能は php4.0 で廃止されましたが、 include() を使用して実装することができます。include() ステートメント
include ステートメントは、実行時にインクルードされるファイルのみを読み取ります。エラー処理を容易にするために、include ステートメントを使用します。include エラーが発生した場合、プログラムはエラー メッセージが表示されますが、プログラムは実行を続行します。
PHP プロセッサは include() ステートメントに遭遇するたびにそれを再処理するため、条件付き制御ステートメントやループ ステートメントで include() を使用して、さまざまな状況に応じてさまざまなファイルをインクルードできます。
リーリー
php3.0 および php4.0 の include() ステートメントにインクルードされたファイルでは、return ステートメントを使用して値を返し、インクルードされたファイルのコンテンツの実行を停止できます。ただし、php3.0 と php4.0 では、そのような状況の処理方法が異なります。 php3.0 では、return ステートメントを関数内にしない限り、{} 内に含めることはできません。これは、return ステートメントがファイルの戻り値ではなく関数の戻り値を表すためです。 php4.0 では、関数の戻り値と同様に、ファイル内で数値を返すこともできます。このようなステートメントは通常、php3.0 でエラーを報告します。次の例で説明します:インクルードされたファイルが test.inc で、メイン ファイル main.php が同じディレクトリにあると仮定します。 test.incの内容は以下の通りです
リーリー
次のステートメントが main.php ファイルに含まれているとします。<?php $retval=include('test.inc'); echo "File returned:'$retval'<br>n"; ?>
php3.0解释器会在第二行报告错误,而不能得到include()语句的返回值。但在php4.0中会得到下面的结果:
Before the return File returned: '27'
下边假设main.php改为:
<?php include('test.inc'); echo "Back in main.html<br>n"; ?>
在php4.0中的输出结果是:
Before the return Back in main.html
在php5.0中的输出结果也是:
Before the return Back in main.html
在php3.0中的输出结果是:
Before the return 27Back in main.html
Parse error:parse error in /apache/htdocs/phptest/main.html on line 5
出现上面的错误是因为return语句位于{}内部而且不是一个函数内部。如果把{}去掉,使它位于test.inc的最外层,输出结果是:
Before the return 27Back in main.html
之所以出现27,是因为在php3.0中不支持include()返回。
require_once()和include_once()语句分别对应于require()和include()语句。require_once()和include_once()语句主要用于需要包含多个文件时,可以有效地避免把同一段代码包含进去而出现函数或变量重复定义的错误。例如:如果创建两个文件util.inc和fool.inc,程序代码分别为:
util.inc:
<?php define(PHPVERSION,floor(phpversion())); echo "GLOBALS ARE NICE<br>n"; function goodTea() { return "Olong tea tasts good!"; } ?>
和fool.inc:
<?php require ("util.inc"); function showVar($var) { if(PHPVERSION==4) { print_r($var); } else { var_dump($var); } } ?>
然后在error_require.php中包含这两个文件:
<?php require("fool.inc"); require("util.inc");//此句会产生一个错误 $foo=array("1",array("complex","quaternion")); echo "this is requiring util.inc again which is also<br>n"; echo "required in fool.incn"; echo "Running goodTea:".goodTea()."<br>n"; echo "Printing foo:<br>n"; showVar($foo); ?>
当运行error_require.php时,输出结果如下:
GLOBALS ARE NICE GLOBALS ARE NICE Fatal error:Cannot redeclare goodTea() in util.inc on line 4
如果使用require_once()语句来代替 require()语句,就不会出现上面的错误。我们把error_require.php和fool.inc中的require()语句改为require_once()语句并重命名为error_require_once.php,这是显示结果如下:
GLOBALS ARE NICE this is requiring util.inc again which is also required in fool.inc Running goodTea:Olong tea tastes good! Printing foo: Array([0] => 1 [1] => Array ([0] => complex [1] = quaternion))
include_once()语句的语法和include()语句类似,主要区别也是避免多次包含一个文件而引起函数或变量的重复定义。
require_once语句有一个引用链,它可以保证文件加入你的程序仅仅只有一次,而且会避开变量值和函数名之间的冲突。
和require_once语句一样,include_once语句把include的功能扩展了。在程序执行期间,将指定的文件包含进来,如果从文件引用进来的程序先前已经包含过的时候,include_once()就不会把它再包含进来。也就是仅仅可以引用同一个文件一次!
include_once() 语句在脚本执行期间包含并运行指定文件。此行为和 include() 语句类似,唯一区别是如果该文件中的代码已经被包含了,则不会再次包含。如同此语句名字暗示的那样,只会包含一次。
include_once() 应该用于在脚本执行期间同一个文件有可能被包含超过一次的情况下,想确保它只被包含一次以避免函数重定义,变量重新赋值等问题。
使用 require_once() 和 include_once() 的更多例子见最新的 PHP 源程序发行包中的 PEAR 代码。
返回值和 include() 相同。如果文件已被包含,本函数返回 TRUE。
注: include_once() 是 PHP 4.0.1pl2 中新加入的。
注: 要注意 include_once() 和 require_once() 在大小写不敏感的操作系统中(例如 Windows)的行为可能不是所期望的。
如果一个文件不想被包含多次可以使用include_once或require_once## 读取,可以写入文档数据。
<?php function r($file_name) { $filenum=@fopen($file_name,"r"); @flock($filenum,LOCK_SH); $file_data=@fread($filenum,filesize($file_name)); @fclose($filenum); return $file_data; } function w($file_name,$data,$method="w") { $filenum=@fopen($file_name,$method); flock($filenum,LOCK_EX); $file_data=fwrite($filenum,$data); fclose($filenum); return $file_data; } ?>