PHP 入門

PHPのモジュール化:include と require

PHPアプリケーションは通常、コードを整理し、関心の分離(Separation of Concerns)を行い、再利用性(Reusability)を高めるために複数のファイルで構成されます。すべてのコードを一つの巨大なファイルに詰め込むのではなく、開発者はプロジェクトをより小さく、管理しやすいユニットに分割することを好みます。このアプローチはコードの可読性を向上させ、メンテナンス(Maintenance)作業を簡素化し、アプリケーションの異なる部分で共通の機能、設定、またはフロントエンドのテンプレートを共有することを可能にします。

1. include 文

include 文は、別のPHPファイルの内容を現在のファイルに埋め込むために使用されます。include が実行されると、PHPは呼び出された正確な位置で指定されたファイルを処理します。まるでそのファイルの内容が元からそこに書かれていたかのように動作します。

1.1 include の基本的な使い方

include を使用するには、取り込みたいファイルのパスを指定するだけです。パスは現在のスクリプトからの相対パス、または絶対パスを指定できます。

// included_file.php
<?php
$message = "included_file.phpからの挨拶です!"; 

function greetUser($name) {
    return "ようこそ、" . $name . "さん!";
}
?>

// main_script.php
<?php
echo "メインスクリプトの実行を開始します...\n"; 

include 'included_file.php'; // included_file.php の内容をインクルード

echo $message . "\n"; // これで $message 変数にアクセス可能になります
echo greetUser("Alice") . "\n"; // これで greetUser() 関数を呼び出せます 

echo "メインスクリプトの実行が終了しました。\n";
?>

この例では、include 文が実行されると、main_script.php は即座に included_file.php で定義された $message 変数や greetUser() 関数にアクセスできるようになります。

1.2 include のエラー処理メカニズム

include で指定したファイルが見つからない、またはアクセス権限に問題がある場合、include は警告レベルのエラー(E_WARNING)を生成します。警告を出した後もスクリプトの実行は継続され、残りのコードが実行されます。この特性は、サイドバーのウィジェットや広告バナーなど、アプリケーションの非根幹部分を取り込む際に非常に便利です。これらが欠落していても、ページ全体のロードがクラッシュすべきではないからです。

// main_script_with_warning.php
<?php
echo "存在しないファイルをインクルードしようとしています...\n"; 

include 'non_existent_file.php'; // これは E_WARNING を生成します 

echo "警告が発生した後もスクリプトは続行されます。この行は実行されます。\n";
// 'non_existent_file.php' に依存する後続のコードはエラーになる可能性がありますが、
// スクリプト自体はここで停止しません。
?>

non_existent_file.php が見つからない場合、PHPは警告を出しますが、main_script_with_warning.php は引き続き「警告が発生した後もスクリプトは続行されます...」と出力します。

1.3 include の実戦的なユースケース

ヘッダー/フッターのテンプレート: 多くのWebアプリケーションでは、include を使用して複数のページに共通のヘッダー(Header)やフッター(Footer)を挿入します。これによりサイトの外観の一貫性が保たれ、共通要素のHTMLコードを一箇所で管理できます。

<!-- header.php -->
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>マイ・アメイジング・サイト</title>
</head>
<body>
    <header>
        <h1>サイトへようこそ</h1>
        <nav>
            <a href="/">ホーム</a>
            <a href="/about.php">私たちについて</a>
        </nav>
    </header>
    <main>
<!-- footer.php -->
    </main>
    <footer>
        <p>© <?php echo date("Y"); ?> マイ・アメイジング・サイト. All rights reserved.</p>
    </footer>
</body>
</html>
// index.php
<?php include 'header.php'; ?>
    <h2>ホームページのコンテンツ</h2>
    <p>ここはメインのコンテンツエリアです。</p>
<?php include 'footer.php'; ?>

この構造により、index.phpheader.phpfooter.php を読み込むだけで、再利用可能なコンポーネントから完全なHTMLページを組み立てることができます。

設定ファイル: include は、データベースの認証情報やAPIキーなどの設定(Configuration)を読み込むためにもよく使われます。セキュリティと管理のしやすさのために、これらの情報は通常別のファイルに保存されます(注:実務では、次に説明する require を使用するのが一般的です)。

2. require 文

require 文も同様に、別のPHPファイルの内容を現在のファイルに埋め込むために使用されます。しかし、require はエラー処理メカニズムにおいて決定的な違いがあります。

2.1 require の基本的な使い方

require の構文は include と全く同じです。

// common_functions.php
<?php
function calculateSum($a, $b) {
    return $a + $b;
}
?>

// application_entry.php
<?php
echo "アプリケーションをロード中...\n"; 

require 'common_functions.php'; // common_functions.php を読み込み 

echo "5 と 3 の合計は: " . calculateSum(5, 3) . "\n";
echo "アプリケーションのロードに成功しました。\n";
?>

2.2 require のエラー処理メカニズム

require で指定したファイルが見つからない、またはアクセスできない場合、require は致命的エラー(E_ERROR)を生成します。このエラーはスクリプトの実行を即座に停止させます。

この挙動は、コアライブラリ(Library)、データベース接続ファイル、重要な設定など、スクリプトの実行に絶対不可欠なファイルを読み込むのに適しています。もしこれらのファイルが紛失していれば、アプリケーションは正常に動作できないため、実行を継続して予測不能な連鎖エラーを引き起こすよりも、即座に中止する方がはるかに安全です。

// application_critical.php
<?php
echo "存在しない重要なファイルを require しようとしています...\n"; 

require 'critical_library.php'; // これは E_ERROR を生成し、スクリプトを強制停止します 

// critical_library.php が見つからない場合、下の行は【絶対に】実行されません
echo "この行に到達することはありません。\n";
?>

2.3 require の実戦的なユースケース

コアライブラリとフレームワークファイル: 大規模なアプリケーションやフレームワーク(Framework)を使用する場合、require はアプリケーション全体が依存する基礎ファイルのロードに使用されます。例えば、クラスをロードするためのオートローダー(Autoloader)スクリプトなどです。

// index.php (メインエントリファイル)
<?php
require 'vendor/autoload.php'; // Composer管理の依存関係。欠かせません。

// App\Core\Application クラスがロードされている必要があります
$app = new App\Core\Application();
$app->run();
?>

vendor/autoload.php が紛失している場合、アプリケーションは依存クラスをロードできず、実行を続ける意味がありません。require はこの硬直した依存関係が満たされることを保証します。

データベース接続ファイル: データベース接続の確立は、ほとんどのWebアプリケーションの前提条件です。接続ロジックが別ファイルにあり、そのファイルが紛失していれば、アプリは完全に機能停止します。

// user_profile.php
<?php
require 'db_connect.php'; // データベース操作の絶対的な前提条件

// require に成功して初めて、$mysqli オブジェクトが使用可能になります
$result = $mysqli->query("SELECT * FROM users WHERE id = 1");
?>

db_connect.php が欠けている状態で後続のクエリを実行すると、一連のエラーが発生します。require は強固なゲートキーパー(門番)として機能します。

3. include と require の核心的な比較

根本的な違いは、エラー発生時の処理レベルにあります。

特性includerequire
エラーレベル警告 (E_WARNING) を生成致命的エラー (E_ERROR) を生成
実行フロー警告後もスクリプトは続行エラー後、スクリプトは即座に強制終了
適用シーン非重要なファイル(ヘッダー/フッター、オプションのUIコンポーネント等)プログラムの存続に関わる重要ファイル(コアライブラリ、設定ファイル、DB接続等)

3.1 経験則:いつどちらを使うべきか?

  • include を使う: 読み込むファイルが紛失しても、スクリプトが部分的に機能を提供できる(UXが多少低下しても動作する)場合。例えば、サイドバーの広告モジュールが消えても、メインの記事は読める場合などです。
  • require を使う: 読み込むファイルがスクリプトの正常な動作に絶対不可欠な場合。もし紛失すれば、脳を失ったかのように動作不能になり、不正なデータの生成や深刻なセキュリティホールを防ぐために即座に停止させる必要がある場合です。