include_onceとrequire_onceの違いについて

2019年6月2日

include_onceとrequire_onceの違いを明確に把握しておらず、今更ですが、違いを調べてみました。
下の公式サイトに記載されているとおり、大きな違いは、エラー時の動作が異なります。

公式サイト
http://jp2.php.net/manual/ja/function.include.php

具体的には、include_onceは、対象ファイルが見つからない場合に、「Warning」を発行し以降の処理を続行します。

この対象ファイルを検索する範囲は、呼出元のスクリプトのディレクトリと、現在の作業ディレクトリになります。

一方の、require_onceは、対象ファイルが見つからない場合に、「fatal_error」を発行し以降の処理を中断します。

そのため、対象ファイルが取込めないことで、重大なエラーとなる処理の場合には、require_onceを使用することが推奨されています。

サンプルプログラム

エラーが発生しないパターン

file-a.php
<?php
  // 共通変数を定義
  $commom_message = "メッセージを設定しました!";
?>

test-include.php
<?php
  include_once './file-a.php';

  echo $commom_message . PHP_EOL;
  echo "処理が終わりました!";
?>

実行結果

php ./test_include.php

<p>取込まれました!</p>
メッセージを設定しました!
処理が終わりました!


* test-require.php *
<?php
require_once './file_a.php';
  echo $commom_message . PHP_EOL;
  echo "処理が終わりました!";
?>

実行結果

php ./test_require.php

<p>取込まれました!</p>
メッセージを設定しました!
処理が終わりました!

エラーが発生するパターン

file-a.php
<?php
  // 共通変数を定義
  $commom_message = "メッセージを設定しました!";
?>

test-include.php
<?php
  include_once './file-none.php';

  echo $commom_message . PHP_EOL;
  echo "処理が終わりました!";
?>


実行結果

php ./test_include.php

Warning: main(./file_ab.php): failed to open stream: No such file or directory in /home/xxx/test_include.php on line 2
Warning: main(): Failed opening './file_ab.php' for inclusion (include_path='.:/usr/local/php4/lib/php:/usr/share/pear') in /home/xxx/test_include.php on line 2
Notice: Undefined variable:  commom_message in /home/xxx/test_include.php on line 6
処理が終わりました!


test-require.php
<?php
require_once './file_none.php';
  echo $commom_message . PHP_EOL;
  echo "処理が終わりました!";
?>

実行結果

php ./test_require.php

Warning: main(./file_ab.php): failed to open stream: No such file or directory in /home/xxx/test_require.php on line 2
Fatal error: main(): Failed opening required './file_ab.php' (include_path='.:/usr/local/php4/lib/php:/usr/share/pear') in /home/xxx/test_require.php on line 2

上記の実行結果からわかるように、
include_onceは、対象ファイルが見つからない場合でも、以降の処理を実行しています。

一方のrequire_onceは、以降の処理を中断します。

この理由から、重要な共通ファイルなど見つからない場合に、処理を中断したい場合は、
require_onceを利用することが推奨されています。

詳細については、プログラミング学習サイトに記載中です!

スポンサーリンク