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 という名前の)以下のファイルが存在すると仮定します。
メインファイル(main.html)に以下の文が含まれている 仮定します。
main.htmlがPHP 3でコールされた場合、 2行目でパースエラーとなります。つまり、PHP 3では include()の値を取得できないのです。 しかし、PHP 4では、以下のような結果となります。
ここで、main.htmlを以下のように変えたと 仮定しましょう。
PHP 4では、出力は次のようになります。
上のパースエラーは、test.inc内で return文が関数以外のブロックで括られている ためです。returnをブロックの外に移動すると、出力は次のようになります。
スプリアス'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()も参照下さい。