初めに
- PHP/Mysqlを使用して1年ほど
- Symfony:ORM(doctorin)やLaravelを半年ずつほど
概要
PHPで外部ファイルを読み込むときに使用している「require」と「require_once」の使い分けを理解していないので調べてみました。
呼び出し元のファイルは「parent.php」として先に定義しておきます。
//parent.php
$require = "Hello world";
$require_once = "Hello world";
1. requireについて
そもそも「require」とは何かPHP公式ドキュメントを調べてみました。
require
は include とほぼ同じですが、失敗した場合に E_COMPILE_ERROR
レベルの致命的なエラーも発生するという点が異なります。 つまり、スクリプトの処理がそこで止まってしまうということです。一方 include の場合は、警告 (E_WARNING
) を発するもののスクリプトの処理は続行します。
要するに、ファイル読み込みをする機能で、指定のファイルがない場合致命的なエラーによって処理が止まるよ!と解釈しています。
※includ については別途記事にしようと思います。
よく使用する「require」構文です。
require 'parent.php';
echo $require . PHP_EOL; //出力結果はHello world
2. require_once について
1.では「require」について調べましたが、自分自身よく使用するのは「require_once」です、処理の内容について調べてみました。
require_once
式は require とほぼ同じ意味ですが、 ファイルがすでに読み込まれているかどうかを PHP がチェックするという点が異なります。 すでに読み込まれている場合はそのファイルを読み込みません。
ファイルを読み込むという点では同じですが、「require」では複数回読み込み(定義を呼び出し)をすることが可能でしたが、「require_once」では一度ファイルを読み込んだものは二回目以降、読み込まないようです。
「require_once」
require_once 'parent.php';
echo $require_once . PHP_EOL; //出力結果はHello world
二回目以降、読み込まない
→文言だけでは少しややこしいのでコードで見てみましょう。
require 'parent.php';
echo $require . PHP_EOL; //出力結果はHello world
require_once 'parent.php';
echo $require_once . PHP_EOL; //出力結果はHello world
//変数の値を変更してみる
$require = 'text_change';
$require_once = 'text_change';
//requireでの読み込みなので、読み込み時 $require は Hello world の状態で呼び出される
require 'require.php';
echo $require . PHP_EOL; //出力結果はHello world
//require_onceでの読み込みなので、2回目は読み込まれず変数の値が変更されル
require_once 'require_once.php';
echo $require_once . PHP_EOL; //出力結果はtext_change
上記コードから呼び出し時の変数が初期値に戻っています。
3. require / require_once どちらを使うか?
2.にて二回目以降の呼び出し結果を比較しましたが、普段はどちらを使用すればよいのか調べました。
関数の再定義や変数値の再代入が起こると想定外の結果が起こります、普段使用するのであれば、「require_once」の方がよさそうです。
まとめ
-
「require」はソースコード中で実行されるたびに再度、読み込みを行う
-
関数やクラスは重複定義となるため、致命的エラーとなり処理が止まってしまう
-
変数は読み込んだ値に上書きされる
-
「require_once」はそのソースコード中で一度だけ読み込む
-
普段使用際は、関数やクラスの定義がある場合はこちらを使う