【PHP】includeとrequireとinclude_onceとrequire_onceの違い




include、require、include(require)とinclude_once(require_once)の違いについて実例を交えて説明します。

include、require、include_once、require_onceの違いについて

include、require、include_once、require_onceはすべて基本処理は同じで外部ファイルを読み込む制御構造(statement)であり、関数(function)ではありません。
そのため、以下のどちらでも表現可能です。

include 'inc1.php';
include('inc1.php');

_onceがついているかどうかで違うことは、_onceがついている場合、すでに読み込まれているファイルは読み込みません。
_onceがついていないincludeやrequireは複数回書くとその分同じファイルを読み込みます。

実例

では早速いろいろなパターンで読み込み確認をしてみます。

準備

読み込む外部ファイルはinc1.phpとし、以下を定義しておきます。

<?php
echo '* inc1 *[' . mt_rand() . ']' . PHP_EOL;

複数回実行した場合のinclude、require、include_once、require_onceの違い

inc1.phpが存在する場合のinclude、require、include_once、require_onceの違いは以下の通りです。

ファイルが存在する場合はincludeもrequireも結果は全く同じなのでincludeで紹介します。

<?php
echo '[start]' . PHP_EOL;
echo '1回目' . PHP_EOL;
include 'inc1.php';
echo '2回目' . PHP_EOL;
include 'inc1.php';
echo '3回目' . PHP_EOL;
include 'inc1.php';
echo '[end]' . PHP_EOL;

結果は以下のようにincludeの分だけ実行されます。

[start]
1回目
* inc1 *[825576760]
2回目
* inc1 *[695929124]
3回目
* inc1 *[8779902]
[end]

次にinclude_onceの場合です。

<?php
echo '[start]' . PHP_EOL;
echo '1回目' . PHP_EOL;
include_once 'inc1.php';
echo '2回目' . PHP_EOL;
include_once 'inc1.php';
echo '3回目' . PHP_EOL;
include_once 'inc1.php';
echo '[end]' . PHP_EOL;

結果はincludeと違って1回しか実行されていません。

[start]
1回目
* inc1 *[631087253]
2回目
3回目
[end]

require、require_onceについては読み込むファイルが存在する場合は同じ挙動になります。

includeとrequireの違い

次にincludeとrequireの違いを確認します。
読み込むファイルが存在する場合は上記の処理になりますが、読み込むファイルが存在しない場合に挙動が変わりますのでその確認をします。
先ほど読み込んでいたinc1.phpをリネーム、削除などで読み込めない状態にします。
その後以下の確認を行います。
まずincludeの場合です。

<?php
echo '[start]' . PHP_EOL;
echo '1回目' . PHP_EOL;
include 'inc1.php';
echo '2回目' . PHP_EOL;
include 'inc1.php';
echo '3回目' . PHP_EOL;
include 'inc1.php';
echo '[end]' . PHP_EOL;
[start]
1回目
PHP Warning:  include(inc1.php): failed to open stream: No such file or directory in /path/to/test.php on line 4

Warning: include(inc1.php): failed to open stream: No such file or directory in /path/to/test.php on line 4
PHP Warning:  include(): Failed opening 'inc1.php' for inclusion (include_path='.:/usr/local/Cellar/php@7.1/7.1.20/share/php@7.1/pear') in /path/to/test.php on line 4

Warning: include(): Failed opening 'inc1.php' for inclusion (include_path='.:/usr/local/Cellar/php@7.1/7.1.20/share/php@7.1/pear') in /path/to/test.php on line 4
2回目
※1回目と同じエラーなので省略
3回目
※1回目と同じエラーなので省略
[end]

次にrequireの場合です。

<?php
echo '[start]' . PHP_EOL;
echo '1回目' . PHP_EOL;
require 'inc1.php';
echo '2回目' . PHP_EOL;
require 'inc1.php';
echo '3回目' . PHP_EOL;
require 'inc1.php';
echo '[end]' . PHP_EOL;
[start]
1回目
PHP Warning:  include(inc1.php): failed to open stream: No such file or directory in /path/to/test.php on line 4

Warning: include(inc1.php): failed to open stream: No such file or directory in /path/to/test.php on line 4
PHP Warning:  include(): Failed opening 'inc1.php' for inclusion (include_path='.:/usr/local/Cellar/php@7.1/7.1.20/share/php@7.1/pear') in /path/to/test.php on line 4

Warning: include(): Failed opening 'inc1.php' for inclusion (include_path='.:/usr/local/Cellar/php@7.1/7.1.20/share/php@7.1/pear') in /path/to/test.php on line 4

大きな違いとして、includeは外部ファイルが読み込めずエラーが発生しても処理を続けます。
requireは外部ファイル読み込みに失敗した場合、処理を終了するという違いがあります。