include

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

"URL fopen ラッパー"がPHPで有効な場合(デフォルト設定では有効です)、 ローカルなパス名の代わりにURLを用いてinclude() されるファイルを指定することが可能です。詳細な情報については、 リモートファイルfopen()を参照下さい。

ファイルの読み込みに関して注意すべき点としては、ファイルが include()またはrequire() される際には、読み込まれるファイルの先頭でPHPモードから抜けてHTML モードになること、読み込み完了時にPHPモードに戻ることがあります。 このため、読み込むファイル中のPHPコードとして実行する必要がある コードは、有効なPHP の開始タグおよび終了タグ で括る必要があります。

読み込み処理はinclude文を処理する度に行われます。 このため、異なった複数のファイルを読み込むためにループ構造の中で includeを使用することができます。


$files = array ('first.inc', 'second.inc', 'third.inc');
for ($i = 0; $i < count($files); $i++) {
    include $files[$i];
}
     

include()require()と異なり、 include文が実行される度に再度評価されます。(そして、実行時に初めて 評価されます。)一方、require()文は、(条件式が FALSEであるif文の中に ある場合のように)読み込まれるファイルの内容が評価されるかによらず最 初に処理された際に読み込まれるファイルで置換されます。

include()は特殊な言語構造なので、if構造内 にある時には、命令ブロックとして括っておく必要があります。


/* 以下は誤っており、希望通りに動作しません。 */
 
if ($condition)
    include($file);
else
    include($other);
 
/* 以下が正解です。 */
 
if ($condition) {
    include($file);
} else {
    include($other);
}
     

PHP 3およびPHP 4では共にinclude()されたファイル内で ファイルの実行処理を終了し呼出側のスクリプトに戻るために return文を実行することが可能です。 しかし、動作にはいくつかの違いがあります。まず、PHP 3では 関数ブロック以外のブロック内でreturnを 使用することはできません。PHP 3では、return が適用っMるのは関数であり、ファイル全体には適用できません。 しかし、PHP 4ではこの制限はありません。また、PHP 4では include()されたファイルから値を返すことが可能です。 通常の関数と同様にinclude()コールの値を 取得できます。これは、PHP 3ではパース時にエラーとなります。

例 11-1PHP 3とPHP 4におけるinclude()

メインファイルと同じディレクトリに(test.inc という名前の)以下のファイルが存在すると仮定します。

<?php
echo "Before the return <br>\n";
if (1) {
    return 27;
}
echo "After the return <br>\n";
?>
     

メインファイル(main.html)に以下の文が含まれている 仮定します。

<?php
$retval = include ('test.inc');
echo "File returned: '$retval'<br>\n";
?>
     

main.htmlがPHP 3でコールされた場合、 2行目でパースエラーとなります。つまり、PHP 3では include()の値を取得できないのです。 しかし、PHP 4では、以下のような結果となります。

Before the return
File returned: '27'
     

ここで、main.htmlを以下のように変えたと 仮定しましょう。

<?php
include ('test.inc');
echo "Back in main.html<br>\n";
?>
     

PHP 4では、出力は次のようになります。

Before the return
Back in main.html
     
しかし、PHP 3では出力は以下となります。

Before the return 
27Back in main.html

Parse error: parse error in /home/torben/public_html/phptest/main.html on line 5
     

上のパースエラーは、test.inc内で return文が関数以外のブロックで括られている ためです。returnをブロックの外に移動すると、出力は次のようになります。

Before the return
27Back in main.html
     

スプリアス'27'はPHP 3がファイルからreturnにより 値を返すことをサポートしていないことによるものです。

ファイルがinclude()で読み込まれる際、そのファイ ルに含まれるコードは、include()を実行する行の変 数スコープを継承します。コールする側のファイルのその行で利用可能な 全ての変数が、読み込まれたファイル内で利用可能です。コールする側の ファイルの関数内でinclude()を行う場合、コールさ れるファイルに含まれる全てのコードは、その関数内で定義されているも のとして動作します。

include()で読み込まれたファイルが、fopen ラッパー を用いてHTTP経由でコールされた場合、そして、ターゲットのサーバーが そのターゲットファイルをPHPコードとして解釈する場合、変数は、 HTTP GETを使用している場合と同様にURLリクエストとして include()されたファイルに渡すことが可能です。 直接的な記述ではありませんが、include()でファイル を読み込むのと同様に親ファイルの変数スコープを継承します。 スクリプトは、実際にはリモートサーバーで実行された後、結果はローカ ルスクリプトに読み込まれます。


/* この例は、someserverで .php を処理するように設定されており、.txt に
 * ついては設定されていないことを仮定しています。また、ここでの'動作す
 * る'という意味は、変数 $varoneと$vartwoがinclude()で読み込まれたファ
 * イルで利用であることを意味します。*/

/* 動作せず; file.txt は someserverで処理されない。 */
include ("http://someserver/file.txt?varone=1&vartwo=2");

/* 動作せず; ローカルファイルシステムの'file.php?varone=1&vartwo=2'
 * という名前のファイルを探す。 */
include ("file.php?varone=1&vartwo=2");               

/* 動作する。 */
include ("http://someserver/file.php?varone=1&vartwo=2"); 

$varone = 1;
$vartwo = 2;
include ("file.txt");  /* 動作する。 */
include ("file.php");  /* 動作する。 */
     

require(), require_once(), include_once(), readfile(), virtual()も参照下さい。