はじめに
これまでの記事で include と include_once を解説し、その中で何度か「require はより厳格な代替構文」という形で触れてきました。今回は、その require を正面から取り上げます。
require は include とほぼ同じ構文・用途を持ちますが、両者には決定的な違いがあります。それは、ファイルの読み込みに失敗した際の挙動です。include が警告を出すだけで処理を継続するのに対し、require は致命的エラー(Fatal Error)を発生させ、スクリプトの実行を即座に停止します。この厳格さこそが、「このファイルがなければアプリケーションとして成立しない」という、本当に重要な依存関係を表現するために require が使われる理由です。本記事では基本的な使い方から、include との使い分け、実践的な活用例まで詳しく解説します。
構文概要
| 項目 | 内容 |
|---|---|
| 構文名 | require |
| 種別 | 言語構文(関数ではない) |
| 構文例 | require 'path/to/file.php'; |
| 戻り値 | 読み込んだファイルが明示的にreturnした値、またはデフォルトで1 |
| 失敗時の挙動 | 致命的エラー(Fatal Error)が発生し、スクリプトの実行が停止する |
| 対応バージョン | PHP 4以降 |
| 関連する構文 | include、require_once、include_once |
includeとの決定的な違い(イメージ図)
存在しないファイルを指定した場合
include 'missing.php';
│
▼
E_WARNING: "Warning: include(missing.php): Failed to open stream..."
← スクリプトはそのまま次の行へ処理を続ける
require 'missing.php';
│
▼
E_ERROR (致命的エラー): "Fatal error: Uncaught Error:
Failed opening required 'missing.php'"
← スクリプトの実行がここで完全に停止する
★この記事の対象
ポイントは、この挙動の違いが**「このファイルの欠如を許容できるかどうか」という設計判断をコードで明示する**という点です。アプリケーションの基本設定ファイルや、必須のクラス定義ファイルなど、それがないとアプリケーションが正しく動作しえないファイルには、必ず require(または require_once)を使うべきです。
実践サンプル7選
例1:基本的な使い方
<?php
// bootstrap.php: <?php define('APP_VERSION', '1.0.0');
require 'bootstrap.php';
echo 'バージョン: ' . APP_VERSION . PHP_EOL;
例2:Composerのautoload.phpを読み込む定番パターン
<?php
/**
* autoload.phpが存在しないと、クラスのオートロードが一切機能せず
* アプリケーション全体が成立しないため、必ずrequireを使う
*/
require __DIR__ . '/vendor/autoload.php';
echo 'オートローダーを読み込みました' . PHP_EOL;
例3:必須の設定ファイルが欠けている場合の即座な停止を確認する
<?php
echo 'requireの前' . PHP_EOL;
// 存在しないファイルを指定すると、致命的エラーで処理が完全に停止する
require 'nonexistent_critical_file.php';
echo 'この行は実行されない' . PHP_EOL; // 到達しない
例4:環境依存の必須設定ファイルを読み込むブートストラップ
<?php
class Bootstrap
{
/**
* 環境ごとの設定ファイルは、アプリケーション動作の前提条件であり、
* 欠けている場合は起動自体を失敗させるべき
*/
public static function init(string $environment): array
{
$configPath = __DIR__ . "/config/{$environment}.php";
// ファイルが存在しない場合、requireが致命的エラーで止めてくれる
return require $configPath;
}
}
// $config = Bootstrap::init('production');
例5:try-catchでrequireの失敗を捕捉する(PHP 7以降)
<?php
/**
* PHP 7以降、requireの失敗はErrorクラスの例外として
* try-catchで捕捉することが可能になった(ただし推奨されるかは要検討)
*/
function loadCriticalFile(string $path): mixed
{
try {
return require $path;
} catch (\Throwable $e) {
// 重大な依存関係の欠如なので、ログに記録した上で
// 適切なエラーページを表示するなどの対応を検討する
error_log('重要ファイルの読み込みに失敗: ' . $e->getMessage());
http_response_code(500);
exit('サービスが一時的に利用できません');
}
}
// loadCriticalFile(__DIR__ . '/config/database.php');
例6:クラス定義を直接requireで読み込む(オートローダーがない環境)
<?php
/**
* Composerのオートローダーを使わない小規模なスクリプトでは、
* クラス定義ファイルを直接requireで読み込むことがある
*/
require __DIR__ . '/classes/Database.php';
require __DIR__ . '/classes/Logger.php';
// class Database { ... } と class Logger { ... } が定義済みである前提で処理が続く
例7:includeとrequireを使い分ける設計パターン
<?php
class ApplicationLoader
{
public function loadRequired(string $path): void
{
// コア機能: 欠けていたら即座に停止すべき
require $path;
}
public function loadOptional(string $path): void
{
// オプション機能: 欠けていても処理を続行できる
if (file_exists($path)) {
include $path;
}
}
}
$loader = new ApplicationLoader();
// $loader->loadRequired(__DIR__ . '/core/Kernel.php'); // 必須
// $loader->loadOptional(__DIR__ . '/plugins/optional.php'); // 任意
関連機能との比較
| 構文 | 役割 | requireとの違い |
|---|---|---|
require | ファイルを読み込み実行する(厳格) | 本記事の対象。失敗時に致命的エラーで停止する |
include | ファイルを読み込み実行する | 失敗時は警告のみで処理を継続する、より寛容な構文(別記事で解説済み) |
require_once | 同じファイルを一度だけ読み込む(厳格) | requireの重複読み込み防止版。最も広く使われる組み合わせ |
include_once | 同じファイルを一度だけ読み込む | 重複防止はするが、失敗時は警告のみ(別記事で解説済み) |
autoload(Composer/spl_autoload_register) | クラスを必要な時に自動的に読み込む | 明示的なrequireの記述自体を不要にする、現代的な代替手段 |
よくある落とし穴(注意点)
- 致命的エラーで処理が完全に停止することを前提に使う これが
requireの最大の特徴であり、最も重要な注意点です。ユーザー向けのWebページの途中でrequireが失敗すると、画面には見苦しいエラーメッセージだけが表示され、処理が途中で止まってしまいます。本当に必須のファイルにのみ使い、本番環境ではエラー表示の設定(display_errorsなど)にも注意を払いましょう。 - PHP 7以降は
Error例外として捕捉できるが、乱用は避けるrequireの失敗をtry-catchで捕捉すること自体は可能になりましたが(例5を参照)、本来requireは「回復不可能なレベルの依存関係の欠如」を表現するための構文です。日常的に失敗をキャッチして処理を続行する設計であれば、そもそもincludeを使うべきかもしれません。 includeとの使い分けの基準を明確にする 「このファイルがなければアプリケーションが成立しない」ならrequire、「このファイルがなくても処理を続行できる」ならincludeという判断基準を、チームやプロジェクト内で統一しておくと、コードの意図が読み取りやすくなります(例7を参照)。- 重複読み込みの問題は
require単体では解決されないrequire自体には、includeと同様に重複読み込みを防ぐ機能はありません。クラス定義ファイルなどを複数箇所からrequireする可能性がある場合は、次回解説するrequire_onceを使うべきです。 - 現代的なプロジェクトではComposerのオートローダーに一本化されることが多い クラスの読み込みに関しては、Composerのオートローダーを使えば、個々のクラスファイルへの明示的な
requireがほぼ不要になります。requireが直接使われるのは、主にvendor/autoload.phpの読み込みや、環境設定ファイルの読み込みなど、ごく一部の限定的な場面に集約されるのが現代的なスタイルです。
まとめ
| 観点 | まとめ |
|---|---|
| 何をする構文か | 指定したファイルの内容をその場に読み込み、実行する(失敗時は致命的エラー) |
| 主な用途 | Composerのautoload.php読み込み、アプリケーション起動に必須の設定・クラスファイルの読み込み |
includeとの違い | 失敗時にスクリプトの実行を即座に停止させる、より厳格な構文 |
| 選択の基準 | 「そのファイルがなければアプリケーションが成立しないか」でincludeとの使い分けを判断する |
| 注意点 | 致命的エラーによる処理停止、例外としての捕捉の乱用を避けること、重複読み込みは別途require_onceで対処 |
require は、PHPアプリケーションにおける「本当に欠かせない依存関係」を明示するための、厳格な読み込み構文です。include との使い分けを意識することで、コードを読む人にとって「このファイルは絶対に必要なものだ」という設計意図が自然と伝わる、分かりやすいコードを書くことができます。
