WordPressのソースを読んでいて、require文とInclude文の動作が気になったところなのでPHPの基本として押さえておきたいと思います。
どちらも外部のファイルを読み込むという点では同じですが、エラー時の挙動に違いがあるということなのでそれぞれを使ったファイルを作って実際に動かしてみたいと思います。
Include文
こちらは読み込んだファイルでエラーが発生した場合、警告を出しながら処理を継続というものです。
実際に動かして動きを確認します。
↓以下、hello1.phpとして保存 <?php cho "Hello World\n"; ?> ↓以下、hello2.phpとして保存 <?php ech "Hello World\n"; ?> ↓以下、include.phpとして保存 <?php include (dirname(__FILE__) . "hello1.php"); include (dirname(__FILE__) . "hello2.php"); echo "実験終了。\n"; ?>
hello2.phpは本来echoとなるところをechと記述ミスしています。これを動かしてみましょう。ちなみにすべて同じディレクトリに保存してあるのが前提ですので。
これを動かすと
$php include.php Hello World PHP Parse error: syntax error, unexpected '"Hello World\n"' (T_CONSTANT_ENCAPSED_STRING) in /〇〇/〇〇/plg/PHP/hello2.php on line 2 テスト終了
と出力されました。
include.phpの2行目にあたるhello1.phpの実行はうまくいっているのでHello Worldと表示されましたが、3行目は構文エラーが吐き出されて実行されていない状態になっています。
ふつうならここで止まってしまいそうなんですが、Includeの場合は続けて4行目のecho〜は正常に実行されて「テスト終了」の文字が標準出力されていることが確認できます。
require文
それでは先ほどと同じ処理をrequire文に置き換えて実行してみます。
vi require.php <?php require(dirname(__FILE__) . "/hello1.php"); require(dirname(__FILE__) . "/hello2.php"); echo "テスト終了\n"; ?>
Includeをrequireに変えただけで他は同じ、保存するディレクトリも同じ場所にしています。こちらを走らせると…
Hello World PHP Parse error: syntax error, unexpected '"Hello World\n"' (T_CONSTANT_ENCAPSED_STRING) in /home/ryo/plg/PHP/hello2.php on line 2
3行目の構文エラーで処理が停止し、4行目のecho〜が実行されていないですね。
まとめ
WordPressのソースを見ていて気になったincludeとrequireの違いを体験してみるという今回の実験。簡単な内容だと思いますが再度内容をまとめておくと
- include文はエラーが発生しても処理を継続(エラーは吐き出す)
- require文はエラーが発生した時点で処理が停止(こちらもエラーは吐く)
ということになります。
ただ、処理の結果としては思ったとおりの内容なのでいいのですがこれらの使い分けに関してははっきり言って理解できていません。
PHPの学習を続けていく中でいずれわかる時も来ると思いますので、それまでは「ここが違うんだ」という点だけ押さえておきたいと思います。