require_once()

require_once()命令は、C言語のプリプロセッサ #includeの動作と全く同様にこの部分を指定したファ イルで置換し、この面では、require()命令に似てい ます。主な違いは、読み込みの連鎖です。 require_once()を使用した場合、そのコードがスク リプトに読み込まれるのが一回だけであることが保証され、変数の値また は定義した関数の名前が壊されるのを回避します。

例えば、utils.incfoolib.incという2つのファイルを作成するとしましょ う。

例 11-2utils.inc


<?php
define("PHPVERSION", floor(phpversion()));
echo "GLOBALS ARE NICE\n";
function goodTea() {
	return "Oolong tea tastes good!";
}
?>
     

例 11-3foolib.inc


<?php
require ("utils.inc");
function showVar($var) {
	if (PHPVERSION == 4) {
		print_r($var);
	} else {
		var_dump($var);
	}
}

// 他の関数の定義 ...
?>
     
そして、この後、スクリプト cause_error_require.phpを書いて下さい。

例 11-4cause_error_require.php


<?php
require("foolib.inc");
/* 以下の処理は、エラーを発生します。 */
require("utils.inc");
$foo = array("1",array("complex","quaternion"));
echo "this is requiring utils.inc again which is also\n";
echo "required in foolib.inc\n";
echo "Running goodTea: ".goodTea()."\n";
echo "Printing foo: \n";
showVar($foo);
?>
     
後の例を実行した場合、( PHP 4.01pl2を用いた)結果の出力は次のように なります。


GLOBALS ARE NICE
GLOBALS ARE NICE

Fatal error:  Cannot redeclare goodTea() in utils.inc on line 5
     

foolib.incおよび cause_errror_require.phprequire()の代わりに require_once()を使用するように修正し、 後の例のファイル名を avoid_error_require_once.phpに変更すると 次のようになります。

例 11-5foolib.inc (fixed)


...
require_once("utils.inc");
function showVar($var) {
...
     

例 11-6avoid_error_require_once.php


...
require_once("foolib.inc");
require_once("utils.inc");
$foo = array("1",array("complex","quaternion"));
...
     
これを実行すると、(PHP 4.0.1pl2を用いた)出力は次のようになります。


GLOBALS ARE NICE
this is requiring globals.inc again which is also
required in foolib.inc
Running goodTea: Oolong tea tastes good!
Printing foo:
Array
(
    [0] => 1
    [1] => Array
        (
            [0] => complex
            [1] => quaternion
        )

)
     

また、Cプリプロセッサの動作との類似にも注意して下さい。この命令は、 "コンパイル時"、つまり、スクリプトがパースされた後で実行される前に 実行され、実行時に動的に挿入される必要があるスクリプトの部分に使用 するべきではありません。このような場合は、 include_once()または include()を使用して下さい。

require_once()および include_once()の他の例については、最新のPHPソー スコード配布ファイルに含まれるPEARのコードを参照下さい。

require()include()include_once()get_required_files()get_included_files()readfile()virtual()も参照 下さい。