[PHP]requireとは?なくてはならないファイルを厳格に読み込む方法を徹底解説

PHP

はじめに

これまでの記事で 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の記述自体を不要にする、現代的な代替手段

よくある落とし穴(注意点)

  1. 致命的エラーで処理が完全に停止することを前提に使う これが require の最大の特徴であり、最も重要な注意点です。ユーザー向けのWebページの途中で require が失敗すると、画面には見苦しいエラーメッセージだけが表示され、処理が途中で止まってしまいます。本当に必須のファイルにのみ使い、本番環境ではエラー表示の設定(display_errorsなど)にも注意を払いましょう。
  2. PHP 7以降はError例外として捕捉できるが、乱用は避ける require の失敗を try-catch で捕捉すること自体は可能になりましたが(例5を参照)、本来 require は「回復不可能なレベルの依存関係の欠如」を表現するための構文です。日常的に失敗をキャッチして処理を続行する設計であれば、そもそも include を使うべきかもしれません。
  3. includeとの使い分けの基準を明確にする 「このファイルがなければアプリケーションが成立しない」なら require、「このファイルがなくても処理を続行できる」なら include という判断基準を、チームやプロジェクト内で統一しておくと、コードの意図が読み取りやすくなります(例7を参照)。
  4. 重複読み込みの問題はrequire単体では解決されない require 自体には、include と同様に重複読み込みを防ぐ機能はありません。クラス定義ファイルなどを複数箇所から require する可能性がある場合は、次回解説する require_once を使うべきです。
  5. 現代的なプロジェクトではComposerのオートローダーに一本化されることが多い クラスの読み込みに関しては、Composerのオートローダーを使えば、個々のクラスファイルへの明示的な require がほぼ不要になります。require が直接使われるのは、主に vendor/autoload.php の読み込みや、環境設定ファイルの読み込みなど、ごく一部の限定的な場面に集約されるのが現代的なスタイルです。

まとめ

観点まとめ
何をする構文か指定したファイルの内容をその場に読み込み、実行する(失敗時は致命的エラー)
主な用途Composerのautoload.php読み込み、アプリケーション起動に必須の設定・クラスファイルの読み込み
includeとの違い失敗時にスクリプトの実行を即座に停止させる、より厳格な構文
選択の基準「そのファイルがなければアプリケーションが成立しないか」でincludeとの使い分けを判断する
注意点致命的エラーによる処理停止、例外としての捕捉の乱用を避けること、重複読み込みは別途require_onceで対処

require は、PHPアプリケーションにおける「本当に欠かせない依存関係」を明示するための、厳格な読み込み構文です。include との使い分けを意識することで、コードを読む人にとって「このファイルは絶対に必要なものだ」という設計意図が自然と伝わる、分かりやすいコードを書くことができます。

タイトルとURLをコピーしました