require
require と include は、失敗の処理方法を除いてほぼ同じです。 require は、エラーが発生したときに E_COMPILE_ERROR レベルのエラーを生成します。つまり、include は警告 (E_WARNING) を生成するだけで、スクリプトは実行を継続します。
include
include ステートメントは、指定されたファイルをインクルードして実行します。
次のドキュメントも require に適用されます:
インクルードされたファイルは、パラメーターで指定されたパスに従って最初に検索されます。ディレクトリが指定されていない場合 (ファイル名のみ)、include_path で指定されたディレクトリに従って検索されます。ファイルが include_path の下に見つからない場合、include は最終的に、呼び出し元のスクリプト ファイルが配置されているディレクトリと現在の作業ディレクトリを検索します。 include 構造は、ファイルが最後に見つからない場合に警告を発行します。これは、致命的なエラーを発行する require とは異なります。 (include_path については、この記事を参照してください: PHP 拡張オプションと構成情報)
パスが定義されている場合 - 絶対パス (ドライブ文字で始まるか、Windows では、Unix/Linux では / で始まる) かどうかディレクトリへの現在の相対パス ( . または .. で始まる) - include_path は完全に無視されます。たとえば、ファイルが ../ で始まる場合、パーサーは現在のディレクトリの親ディレクトリでファイルを検索します。
ファイルがインクルードされると、そのファイルに含まれるコードはインクルード行の変数スコープを継承します。その時点から、呼び出し側ファイルのその行で使用可能な変数は、呼び出されたファイルでも使用できるようになります。ただし、インクルード ファイルで定義されたすべての関数とクラスにはグローバル スコープがあります。
例 #1 基本的な include の例
vars.php <?php $color = 'green'; $fruit = 'apple'; ?> test.php <?php echo "A $color $fruit"; // A include 'vars.php'; echo "A $color $fruit"; // A green apple ?>
呼び出し元のファイルの関数に include が指定されている場合、呼び出されたファイルに含まれるすべてのコードは、その関数内で定義されているかのように動作します。したがって、その関数の変数スコープに従います。この規則の 1 つの例外はマジック定数です。マジック定数は、包含が行われる前にパーサーによって処理されます。
例 #2 関数
<?php function foo() { global $color; include 'vars.php'; echo "A $color $fruit"; } /* vars.php is in the scope of foo() so * * $fruit is NOT available outside of this * * scope. $color is because we declared it * * as global. */ foo(); // A green apple echo "A $color $fruit"; // A green ?>
ファイルがインクルードされると、パーサーはターゲット ファイルの先頭で PHP モードを終了し、HTML モードに入り、ファイルの末尾で再開します。このため、PHP コードとして実行する必要があるオブジェクト ファイル内のコードは、有効な PHP 開始タグと終了タグ内に含める必要があります。
PHP で「URL fopen ラッパー」が有効になっている場合 (デフォルト設定)、含めるローカル ファイルの代わりに URL (HTTP またはその他のサポートされているラッピング プロトコルを介して - サポートされているプロトコルとラッピング プロトコルを参照) を指定できます。ターゲット サーバーがターゲット ファイルを PHP コードとして解釈する場合は、HTTP GET の URL リクエスト文字列を使用して、インクルードされたファイルに変数を渡すことができます。これは、ファイルを含めて親ファイルの変数空間を継承することと厳密には同じではありません。スクリプト ファイルは実際にリモート サーバー上で実行され、ローカル スクリプトにはその結果が含まれます。
警告 バージョン 4.3.0 より前の Windows バージョンの PHP は、allow_url_fopen が有効になっている場合でも、この関数を介したリモート ファイルへのアクセスをサポートしていません。
例 #3 は HTTP 経由でインクルードします
<?php /* This example assumes that www.example.com is configured to parse .php * * files and not .txt files. Also, 'Works' here means that the variables * * $foo and $bar are available within the included file. */ // Won't work; file.txt wasn't handled by www.example.com as PHP include 'http://www.example.com/file.txt?foo=1&bar=2'; // Won't work; looks for a file named 'file.php?foo=1&bar=2' on the // local filesystem. include 'file.php?foo=1&bar=2'; // Works. include 'http://www.example.com/file.php?foo=1&bar=2'; $foo = 1; $bar = 2; include 'file.txt'; // Works. include 'file.php'; // Works. ?>
セキュリティ警告
リモート ファイルは、ただし、有効な PHP スクリプトはローカル サーバーによって処理されるため、有効な PHP スクリプトを生成する必要があります。リモート サーバーのファイルをリモートで実行し、結果のみを出力する必要がある場合は、readfile() 関数を使用することをお勧めします。また、リモート スクリプトが正当な必要なコードを生成するように細心の注意を払ってください。
戻り値の処理: include は FALSE を返し、失敗すると警告を発行します。インクルードファイルで特に指定されていない限り、インクルードが成功すると 1 が返されます。インクルードされたファイルで return ステートメントを使用すると、ファイル内のプログラムの実行を終了し、それを呼び出したスクリプトに戻ることができます。インクルードされたファイルから値を返すことも可能です。 include呼び出しの戻り値は通常の関数と同様に取得できます。ただし、リモート ファイルをインクルードする場合、リモート ファイルの出力に (ローカル ファイルと同様に) 正当な PHP 開始タグと終了タグが含まれていない限り、これは機能しません。タグ内で必要な変数を定義できます。これは、ファイルがインクルードされる場所の後で使用できるようになります。
include は特殊な言語構造であるため、そのパラメーターには括弧は必要ありません。戻り値を比較するときは注意してください。
Example #4 比较 include 的返回值
<?php // won't work, evaluated as include(('vars.php') == 'OK'), i.e. include('') if (include('vars.php') == 'OK') { echo 'OK'; } // works if ((include 'vars.php') == 'OK') { echo 'OK'; } ?>
Example #5 include 和 return 语句
return.php
$var = 'PHP';
return $var;
?>
noreturn.php
$var = 'PHP';
?>
testreturns.php
$foo = include 'return.php';
echo $foo; // prints 'PHP'
$bar = include 'noreturn.php';
echo $bar; // prints 1
?>
$bar 的值为 1 是因为 include 成功运行了。注意以上例子中的区别。第一个在被包含的文件中用了 return 而另一个没有。如果文件不能被包含,则返回 FALSE 并发出一个E_WARNING 警告。
如果在包含文件中定义有函数,这些函数不管是在 return 之前还是之后定义的,都可以独立在主文件中使用。如果文件被包含两次,PHP 5 发出致命错误因为函数已经被定义,但是 PHP 4 不会对在 return 之后定义的函数报错。推荐使用 include_once 而不是检查文件是否已包含并在包含文件中有条件返回。
另一个将 PHP 文件“包含”到一个变量中的方法是用输出控制函数结合 include 来捕获其输出,例如:
Example #6 使用输出缓冲来将 PHP 文件包含入一个字符串
<?php $string = get_include_contents('somefile.php'); function get_include_contents($filename) { if (is_file($filename)) { ob_start(); include $filename; $contents = ob_get_contents(); ob_end_clean(); return $contents; } return false; } ?>
要在脚本中自动包含文件,参见 php.ini 中的 auto_prepend_file 和 auto_append_file 配置选项。
Note: 因为是一个语言构造器而不是一个函数,不能被 可变函数 调用。
require_once
(PHP 4, PHP 5)
require_once 语句和 require 语句完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含
include_once
(PHP 4, PHP 5)
include_once 语句在脚本执行期间包含并运行指定文件。此行为和 include 语句类似,唯一区别是如果该文件中已经被包含过,则不会再次包含。如同此语句名字暗示的那样,只会包含一次。
include_once 可以用于在脚本执行期间同一个文件有可能被包含超过一次的情况下,想确保它只被包含一次以避免函数重定义,变量重新赋值等问题。
Note:
在 PHP 4中,_once 的行为在不区分大小写字母的操作系统(例如 Windows)中有所不同,例如:
Example #1 include_once 在 PHP 4 运行于不区分大小写的操作系统中
<?php include_once "a.php"; // 这将包含 a.php include_once "A.php"; // 这将再次包含 a.php!(仅 PHP 4) ?>
此行为在 PHP 5 中改了,例如在 Windows 中路径先被规格化,因此 C:\PROGRA~1\A.php 和 C:\Program Files\a.php 的实现一样,文件只会被包含一次。