ホームページ  >  記事  >  バックエンド開発  >  PHP での include と require

PHP での include と require

WBOY
WBOYオリジナル
2016-06-13 13:20:38791ブラウズ

PHP での include と require

転載元: http://blog.sina.com.cn/s/blog_5d2673da0100cp6o.html

?

require()、include()、require_once()、および include_once() の類似点と相違点

require() と include() には多くの類似点といくつかの相違点があります。それらの違いを理解することが重要です。理解していないと間違いを犯しやすくなります。

読者が比較して学べるように、これら 2 つの文をまとめて紹介します。
1.require() ステートメント
require() ステートメントは、C 言語の include() ステートメントと同様に、ステートメント自体の代わりにファイルを指定するために使用されます。 PHP 設定ファイル php.ini の URL fopen Wrappers? がオンになっている場合 (デフォルトでオンになっています)、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 ファイルに含まれるコンテンツは次のようになります。リモートサーバー上で結果を後で処理します。例:
???

require("
http://some_server/file.txt?varfirst=1&varsecond=2");


require("file.php?varfirst=1&varsecond=2");


require("
http://some_server/file.php?varfirst=1&varsecond=2");

$varfirst=1;
$varsecond=2;
require("file.txt");
require("file.php");
????もともと php3.0 では、require() にインクルードされたファイルで return ステートメントを使用できますが、条件として、return ステートメントは {} 内に出現できず、インクルードされたファイルのグローバル スコープ内に出現する必要があります。この require() の機能は php4.0 で廃止されましたが、 include() を使用して実装することができます。

2.include() ステートメント
????include() ステートメントと require() ステートメントには多くの類似点があります。上記の require() ステートメント内の、include() に適用できないことが明示的に示されていない部分を除き、require() ステートメントの関数は include() ステートメントに完全に適用できます。以下では、require() ステートメントでは使用できない include() ステートメントの機能と特徴について説明します。
include ステートメントは、実行時にインクルードされるファイルのみを読み取ります。エラー処理を容易にするために、include ステートメントを使用します。include エラーが発生した場合、プログラムはエラー メッセージが表示されますが、プログラムは実行を続行します。
???PHP プロセッサは include() ステートメントに遭遇するたびにそれを再処理するため、条件付き制御ステートメントやループ ステートメントで include() を使用して、ドキュメントのさまざまな状況に応じてさまざまなステートメントを含めることができます。
???例:
$files=array('first.php','second.php','third.php');
??? ?? ??for($i=0;$i?????????{
???????$files[$i] ];
}
?>
??? php3.0 および php4.0 の include() ステートメントに含まれるファイルでは、return ステートメントを使用して値を返し、以下に含まれるファイルを実行します。ただし、php3.0 と php4.0 では、そのような状況の処理方法が異なります。 php3.0 では、return ステートメントを関数内にしない限り、{} 内に含めることはできません。これは、return ステートメントがファイルの戻り値ではなく関数の戻り値を表すためです。 php4.0 では、そのような制限はなく、関数の戻り値と同様に、ファイル内で数値を返すこともできます。このようなステートメントは

にあります

エラーは通常、php3.0 で報告されます。以下は例です:
??? インクルードされたファイルが test.inc で、メイン ファイル main.php がディレクトリにあると仮定します。 test.inc の内容は次のとおりです:
test.inc
echo "Before the return
n";
if(1)
{
?? ?????return 27;
}
echo "復帰後
n";
?>

次のステートメントが main.php ファイルに含まれているとします:
$retval=include('test.inc');
echo "返されたファイル:' $ retval'
n";
?>
????php3.0 インタープリターは 2 行目にエラーを報告し、include() ステートメントの戻り値を取得できません。しかし、php4.0 では、次の結果が得られます:
リターン前
返されたファイル: '27'
以下では、main.php が次のように変更されたと仮定します:
include( 'test.inc');
echo "Back in main.html
n";
?>
php4.0 での出力結果は次のとおりです:
リターン前
main.html に戻る

php5.0 の

の出力結果も次のようになります。
戻る前
main.html に戻る

php3.0 の

の出力結果は次のとおりです:
return の前
27Back in main.html

Parse error:parse error in /apache/htdocs/phptest/main .html 5 行目

上記のエラーは、return ステートメントが {} 内にあり、関数内にないために発生します。 {} を削除して test.inc の最外層に配置すると、出力結果は次のようになります。
return の前
27main.html に戻る
27 が表示される理由は、php3 にあるためです。 .0 Include() リターンはサポートされていません。

3.require_once() および include_once() ステートメント
require_once() および include_once() ステートメントは、それぞれ require() ステートメントおよび include() ステートメントに対応します。 require_once() および include_once() ステートメントは主に、複数のファイルをインクルードする必要がある場合に使用され、同じコード部分をインクルードすることによって発生する関数または変数の繰り返し定義でのエラーを効果的に回避できます。例: 2 つのファイル util.inc と folk.inc を作成する場合、プログラム コードは次のようになります:
util.inc:
???define(PHPVERSION,floor(phpversion()) ) );
???echo "GLOBALS ARE NICE
n";
???function GoodTea()
???{
?????????return "烏龍茶おいしい!";
???}
?>
and folk.inc:
???require ("util.inc") ;
???function showVar($var)
???{
?????????if(PHPVERSION==4)
?????? ? ??{
?????????print_r($var);
?????????}
???????????else
?????????{
?????????var_dump($var);
????????? ?}
??? }
?>
次に、次の 2 つのファイルを error_require.php に含めます:
require("fool.inc");
require("util.inc") ;//この文はエラーを生成します
$foo=array("1",array("complex","quaternion"));
??? ??echo "これには util.inc が必要ですこれも
n";
echo "fool.incnで必要";
echo "Running goodTea:".goodTea()."
n";
echo "印刷中foo:
n";
showVar($foo);
?>
???? error_require.php を実行すると、出力結果は次のようになります。グローバルは素敵です
????グローバルは素敵です

致命的なエラー: util.inc の 4 行目で GoodTea() を再宣言できません??
require() ステートメントの代わりに require_once() ステートメントを使用すると、上記のエラーは発生しません起こる。 error_require.php と folk.inc の require() ステートメントを require_once() ステートメントに変更し、その名前を error_require_once.php に変更しました。結果は次のようになります:
GLOBALS ARE NICE
これは再び util.inc を必要とします。これは、fool.inc でも
必要です。 Running GoodTea:Olong tea はおいしいです!
Printing foo:
Array([0] => 1 [1] => Array ([0] =>) ; 複素数 [1] = クォータニオン))

include_once() ステートメントの構文は include() ステートメントと似ていますが、主な違いは、ファイルを複数回インクルードすることによって生じる関数または変数の定義の繰り返しを避けることです。

require_once ステートメントには参照チェーンがあり、これにより、ファイルがプログラムに 1 回だけ追加されることが保証され、変数値と関数名の競合が回避されます。

require_once ステートメントと同様に、include_once ステートメントは include の機能を拡張します。プログラムの実行中に、指定されたファイルがインクルードされます。そのファイルから参照されるプログラムが以前にインクルードされている場合、include_once() はそれを再度インクルードしません。つまり、同じファイルは 1 回しか参照できません。

include_once() ステートメントは、スクリプトの実行中に指定されたファイルをインクルードし、実行します。この動作は include() ステートメントに似ていますが、唯一の違いは、ファイル内のコードが既にインクルードされている場合、再度インクルードされないことです。このステートメントの名前が示すように、このステートメントは 1 回だけ含まれます。

include_once() は、スクリプトの実行中に同じファイルが複数回インクルードされる可能性があり、関数の再定義や変数の再割り当てなどの問題を避けるために、ファイルが 1 回だけインクルードされるようにしたい場合に使用する必要があります。

require_once() と include_once() の使用例については、最新の PHP ソース配布パッケージの PEAR コードを参照してください。

戻り値は include() と同じです。ファイルが含まれている場合、この関数は TRUE を返します。

注: include_once() は PHP 4.0.1pl2 で新たに追加されました。

注: 大文字と小文字を区別しないオペレーティング システム (Windows など) における include_once() および require_once() の動作に注意してください

期待どおりではない可能性があります。
例: ???include_once() は Windows では大文字と小文字が区別されません

include_once("a.php"); // これには a.php
include_once("A.php"); // これには a.php が含まれます。 Windows でもう一度! (PHP 4 のみ)
?>

この動作は PHP 5 で変更され、パスが最初に正規化されるため、C:PROGRA~1A.php と C:Program Filesa.php は同じ実装となり、ファイルは 1 回だけインクルードされます。

インクルードするファイルが存在しない場合、include はプロンプトを通知し、次のステートメントの実行を続行し、require は致命的なエラーを表示して終了します。

win32 プラットフォームでは、これらは最初にインクルードされてから実行されるため、ディレクトリの混乱を引き起こす可能性があるため、インクルードされたファイルに include または require ステートメントを含めないことをお勧めします。 Linux では状況が異なる可能性がありますが、まだテストしていません。

ファイルを複数回インクルードしたくない場合は、include_once または require_once## を使用してドキュメント データの読み取りと書き込みを行うことができます。
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;
}
?>

?

非常に詳しい内容なので、必要に応じて確認します。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。