PHPを用いたWebアプリケーション開発において、外部ファイルの読み込みは避けて通れない基本的な操作の一つです。
大規模なシステムになればなるほど、コードの再利用性やメンテナンス性を高めるために、共通処理や設定情報、クラス定義などを別ファイルに切り分けて管理することが一般的になります。
その際、PHPが提供している「require」と「include」という2つの命令を使い分けることになります。
これらは一見すると同じようにファイルを読み込む機能を持っていますが、「読み込みに失敗した際の挙動」に決定的な違いがあります。
この違いを正しく理解していないと、エラーが発生した際に予期せぬ動作を招いたり、セキュリティ上のリスクを生じさせたりする可能性があります。
本記事では、2026年現在の開発現場でも必須知識であるこれら2つの違いと、実務における具体的な使い分け、さらには「_once」系の関数の特性について詳しく解説します。
includeとrequireの根本的な違い
PHPで外部ファイルを読み込むための関数(厳密には言語構造)には、主にinclude、require、include_once、require_onceの4種類が存在します。
まずは基本となるincludeとrequireの違いに焦点を当ててみましょう。
最大の相違点は、指定したファイルが存在しない、あるいは読み込みに失敗した場合のエラーレベルにあります。
includeの場合
includeを使用してファイルを読み込もうとした際、もし対象のファイルが見つからなければ、PHPは警告(E_WARNING)を出力します。
しかし、重要なのはここからです。
includeは警告を出した後に処理を中断せず、それ以降のコードを継続して実行しようとします。
<?php
// 存在しないファイルを読み込んでみる
include 'non_existent_file.php';
echo "このメッセージは表示されます。";
?>
Warning: include(non_existent_file.php): Failed to open stream: No such file or directory in ...
このメッセージは表示されます。
このように、ファイルがなくても「何とか動かし続ける」のがincludeの特性です。
requireの場合
一方でrequireを使用した場合、ファイルの読み込みに失敗するとPHPは致命的なエラー(Fatal Error / E_COMPILE_ERROR)を発生させます。
この場合、スクリプトの実行はその時点で即座に停止されます。
<?php
// 存在しないファイルを読み込んでみる
require 'non_existent_file.php';
echo "このメッセージは表示されません。";
?>
Fatal error: require(): Failed opening required 'non_existent_file.php' (include_path='...') in ...
require(必須とする)という名前の通り、そのファイルがなければ後続の処理を行う意味がない、あるいは行えない場合に適しています。
| 特徴 | include | require |
|---|---|---|
| 失敗時のエラー | E_WARNING (警告) | E_COMPILE_ERROR (致命的エラー) |
| 処理の継続 | 継続する | 停止する |
| 主な用途 | テンプレート、一部のパーツ | 設定ファイル、ライブラリ、クラス定義 |
_once系の挙動とメリット
includeとrequireには、それぞれ末尾に「_once」を付与したinclude_onceとrequire_onceが存在します。
これらは実務において非常に多用される重要な命令です。
多重読み込みの防止
「_once」が付く命令の最大の特徴は、「同じファイルが既に読み込まれている場合、2回目以降の読み込みを行わない」という点です。
例えば、関数の定義やクラスの定義が記述されたファイルを複数回読み込んでしまうと、「Cannot redeclare function…(関数の再定義はできません)」というエラーが発生し、プログラムが停止してしまいます。
これを防ぐために「一度だけ読み込む」という制御が必要になります。
<?php
// functions.php には my_function() の定義があるとする
require_once 'functions.php';
require_once 'functions.php'; // 2回目は無視されるのでエラーにならない
my_function();
?>
require_once の重要性
現在のPHP開発において、requireよりもrequire_onceの方が頻繁に利用されます。
特にライブラリの読み込みや、設定ファイルのロードにおいては、「そのファイルが確実に読み込まれていること」と「二重に読み込まれないこと」の両方が求められるからです。
ただし、_once系は「既に読み込まれたかどうか」をチェックする処理が内部で走るため、極端に大量のファイルを読み込む場合には、通常のrequireに比べて微々たるオーバーヘッドが発生します。
とはいえ、2026年現在のサーバー環境やPHP 8.x以降のパフォーマンスであれば、この差を気にする必要はほとんどありません。
安全性(二重定義エラーの回避)を優先するのがモダンな開発の常石です。
実務における具体的な使い分け
「結局どちらを使えばいいのか?」という疑問に対し、実務での判断基準を整理します。
1. require / require_once を使うべきケース
そのファイルが読み込めなかった際に、「アプリケーションが正常に動作しなくなる」場合は必ずrequire(基本はrequire_once)を使用してください。
- データベースの接続設定: 設定ファイルが読み込めなければDBにアクセスできず、以降の処理はすべて失敗するため、実行を止めるべきです。
- クラス定義・関数ライブラリ: クラスが定義されていない状態でインスタンス化(new)しようとするとエラーになるため、事前に
require_onceで読み込みを保証します。 - オートローダーの読み込み: Composerなどのオートローダー(vendor/autoload.php)は、システム全体の基盤となるため
requireが必須です。
2. include / include_once を使うべきケース
一方で、そのファイルが読み込めなくても、「最悪、エラーメッセージを出さずに処理を続けたい、あるいは代替処理が可能である」場合はincludeを使用します。
- HTMLテンプレートの一部: 例えば「サイドバー」や「フッター」の読み込みに失敗しても、メインコンテンツだけは表示させたいという設計思想の場合に使用されます。
- 動的なコンテンツ切り替え: 条件によって読み込むファイルが変わる際、ファイルが存在しない可能性を許容し、エラーハンドリングを自前で行いたい場合などです。
ただし、現代のWeb開発では「ファイルが見当たらない」という状態自体が異常事態であることが多いため、実際には9割以上の場面で require_once が選ばれる傾向にあります。
パス指定のベストプラクティス
読み込みの失敗を防ぐためには、includeやrequireの記述方法にも注意が必要です。
相対パス(../ など)で記述すると、実行されるスクリプトの場所(カレントディレクトリ)によって読み込みに失敗することがあります。
これを防ぐためには、マジック定数 __DIR__ を使用した絶対パス指定を推奨します。
<?php
// 実行ファイルのディレクトリを起点とした絶対パスで指定
require_once __DIR__ . '/../config/settings.php';
?>
__DIR__ を使用することで、どのファイルから呼び出されても常に正しいパスを指し示すようになり、読み込み失敗による不具合を劇的に減らすことができます。
2026年の開発トレンド:オートローディングと使い分け
2026年現在、PHPの開発現場では、個別のファイルを一つずつrequire_onceで読み込む手法は減少しつつあります。
代わりに、PSR-4規格に基づいた「オートローディング」が主流です。
オートローディング(Autoloading)
クラスが必要になったタイミングで自動的にファイルを読み込む仕組みです。
Composer(PHPのパッケージ管理ツール)を利用している場合、開発者が手動でrequireを書くのは、エントリポイント(index.phpなど)でのオートローダー読み込みの1回だけ、というケースも珍しくありません。
// index.php
require_once __DIR__ . '/vendor/autoload.php';
// 以降、クラスを使用する際に自動で include/require が行われる
$user = new \App\Models\User();
しかし、オートローダーが対象としない「非クラスファイル(定数定義ファイルやヘルパー関数ファイル、HTMLテンプレートファイル)」の読み込みには、依然としてrequireやincludeが直接使われます。
エラーハンドリングと try-catch
PHP 7以降、一部の致命的なエラーはError例外としてキャッチできるようになりましたが、requireによる「ファイル未検出」はコンパイルレベルのエラーとして扱われることが多く、完全に制御するのは難しい側面があります。
そのため、もしファイルが存在するかどうか不確実な場合は、読み込む前にfile_exists()関数などでチェックを行うのが確実です。
$configPath = __DIR__ . '/custom_config.php';
if (file_exists($configPath)) {
require_once $configPath;
} else {
// ファイルがない場合の代替処理
error_log("設定ファイルが見つかりません: " . $configPath);
}
まとめ
PHPにおける外部ファイルの読み込みは、プログラムの構造化において最も基礎的な部分です。
includeとrequireの違いを正しく使い分けることは、堅牢なシステムを構築するための第一歩となります。
今回のポイントを整理すると以下の通りです。
- require: ファイルがないと致命的エラーとなり、プログラムが停止する。設定ファイルや基幹ロジックに必須。
- include: ファイルがなくても警告に留まり、処理は続行される。表示系の一部パーツなどに使用。
- _once系: ファイルの重複読み込みを防ぐ。関数定義やクラス定義を含むファイルで必須。
- __DIR__: 読み込みパスには絶対パスを利用し、環境に依存しない記述を心がける。
現代のモダンな開発では、クラスの読み込みにはComposerのオートローダーを利用し、それ以外のテンプレートや個別のスクリプトの読み込みには、安全性の高いrequire_onceを選択するのがデファクトスタンダードとなっています。
それぞれの特性を理解し、エラーに強くメンテナンス性の高いPHPコードを目指しましょう。
