include()

include()文は指定されたファイルを読み込み、評価します。

以下の記述内容はrequire()にも当てはまります。これら2つの 構文はエラーの扱い方を除けば、その振る舞いは全く同じです。エラーが発生すると include()Warning を出力しますがrequire()を使用している場合は Fatal Errorとなります。 言い換えると、指定されたファイルが無い場合に処理を停止したい場合は require()を使用した方が良い、ということになります。 include()を使用すると、読み込むべきファイルが存在しない 場合も処理が続行されます。include_path を適切に設定することも忘れないで下さい。 読みこまれたファイルで発生したパースエラーは処理を中断しないことに注意して下さい。

読み込むファイルはまずカレントのワーキングディレクトリからの相対パスとしてinclude_path で探され、それから、カレントのスクリプトのディレクトリからの相対パスとしてinclude_path で探されます。 例えば、include_pathが .で、カレントの ワーキングディレクトリが /www/ の 場合、include/a.php を読み込んで、そのファイルの中に include "b.php" と書いてあったとすると、 b.php がまず /www/で探され、その後、 /www/include/で探されます。

ファイルが読み込まれるとそのファイルに含まれるコードは、 include()もしくはrequire()が実行された 行の変数スコープを継承します。 呼び出し側の行で利用可能である全ての変数は、読み込まれたファイル内で利用可能です。

例 11-3. 基本的な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

?>

呼び出し側のファイルの関数定義の中で読み込みが行われ場合は、読み込まれる ファイルに含まれる全てのコードは、その関数内で定義されているものとして 動作します。従って変数スコープのその関数のものが継承されます。

例 11-4. 関数内での読み込み

<?php

function foo()
{
global
$color;

    include
'vars.php';

    echo
"A $color $fruit";
}

/* vars.php は foo() のスコープを継承するため *
* $fruit はこの関数の外では無効となります。  *
* $color はglobalとして宣言されているため    *
* 有効です。                                 */

foo();                    // A green apple
echo "A $color $fruit";   // A green

?>

ファイルが読み込まれるときには、読み込まれるファイルの先頭で PHPモードを抜けてHTMLモードになり、最後に再びPHPモードに戻ります。 このため、読み込むファイル中のPHPコードとして実行する必要がある コードは、 有効なPHPの開始タグおよび終了タグで括る必要があります。

"URL fopenラッパー"が 有効になっている場合(デフォルト設定では有効です)、ローカルなパス名 の代わりにURL(HTTP経由)を用いて読み込むファイルを指定することが可能です。 URLで指定されたサーバがファイルをPHPコードとして解釈することが 出来る場合には、HTTP GETを使用してURLリクエストに引数を指定することが 出来ます。これはファイルの読み込み云々やスコープの継承とは関係なく、 ただ単純にスクリプトがリモートのサーバで実行されて結果がローカルの スクリプトに読み込まれる、というだけのことです。

警告

PHP 4.3.0より前のバージョンのWindows版PHPは、現在この関数に関してリモートファイルアクセス機能をサポートしていません。これは、allow_url_fopenを有効にした場合でも同様です。

例 11-5. HTTP経由のinclude()

<?php

/* この例は www.example.com が.phpはPHPスクリプトとして扱い、.txtは通常の *
* ファイルとして扱うように設定されていると仮定しています。また、ここでの *
* '動作します'という言葉の意味は、変数$fooと$barが読み込まれる側のファイ *
* ルで使用可能である、ということです。                                   */

// 動作しません: www.example.com では file.txt はPHPコードとして解釈されません。
include 'http://www.example.com/file.txt?foo=1&bar=2';

// 動作しません: 'file.php?foo=1&bar=2' という名前のファイルをローカルファイル
// システム上から探し出そうとします。
include 'file.php?foo=1&bar=2';

// 動作します。
include 'http://www.example.com/file.php?foo=1&bar=2';

$foo = 1;
$bar = 2;
include
'file.txt';  // Works.
include 'file.php';  // Works.

?>
リモートファイル, fopen(), file()も参照してください。

include()require()は特殊な 言語構造であるため、条件構造内にある場合は命令ブロックとして 括っておく必要があります。

例 11-6. include() と 条件ブロック

<?php

// これは誤っており希望した通りには動作しません。
if ($condition)
    include
$file;
else
    include
$other;


// これが正解です。
if ($condition) {
    include
$file;
} else {
    include
$other;
}

?>

値の返し方: 読み込まれたファイル内では、ファイルの実行処理を終了し呼出側の スクリプトに戻るためにreturn()文を実行することが可能です。 読み込まれたファイルから値を返すことも可能です。 通常の関数で行うのと同様にincludeコールの値を取得することができます。 しかし、読み込まれたリモートファイル(ローカルファイルの場合も同様)の出力が、 有効なPHPの開始/ 終了タグを有していない限り、リモートファイルを読み込む際に値を 取得することはできません。 必要な変数をこれらのタグの中で宣言することができ、これらの変数は ファイルが読み込まれた位置で使用可能となります。

注意: PHP 3では関数ブロック以外のブロック内でreturnを 使用することはできません。 return()が適用されるのは関数であり、ファイル全体ではありません。

例 11-7. include()return()

return.php
<?php

$var
= 'PHP';

return
$var;

?>

noreturn.php
<?php

$var
= 'PHP';

?>

testreturns.php
<?php

$foo
= include 'return.php';

echo
$foo; // 'PHP'と出力されます

$bar = include 'noreturn.php';

echo
$bar; // 1が出力されます

?>

読み込みが成功すると$barの値は1となります。上の2つの例の違いに 注目してください。最初の例では読み込まれるファイル側でreturn() を使用し、もう一方では使用していません。ファイルを"読み込む"ための他の方法としては fopen()file()、そして include()出力制御関数 と共に使用する方法があります。

注意: これは、関数ではなく 言語構造のため、 可変関数を用いて コールすることはできません。

require(), require_once(), include_once(), readfile(), virtual(), include_pathも参照してください。