[PHP]includeとは?外部ファイルを読み込む基本構文を徹底解説

PHP

はじめに

PHPでコードを複数のファイルに分割し、必要な場所で再利用するために欠かせないのが include です。設定ファイルの読み込み、共通ヘッダー・フッターの挿入、ライブラリの取り込みなど、PHPのほぼすべてのプロジェクトで日常的に使われている、最も基本的な言語構文の一つです。

include は、指定したファイルの中身をその場に展開し、実行する構文です。関数ではなく言語構文(Language Construct)であるため、echo と同様に括弧なしでも使え、独特な挙動もいくつか持っています。本記事では基本的な使い方から、よく似た require との違い、実践的な活用パターンまで詳しく解説します。


構文概要

項目内容
構文名include
種別言語構文(関数ではない)
構文例include 'path/to/file.php'; または include('path/to/file.php');
戻り値読み込んだファイルが明示的にreturnした値、またはデフォルトで1
失敗時の挙動警告(Warning)を出すが、スクリプトの実行は継続する
対応バージョンPHP 4以降
関連する構文require、include_once、require_once

includeの動作フロー(イメージ図)

  main.php
  <?php
  $title = 'サンプルページ';
  include 'header.php';   ← ★ここでheader.phpの中身がそのまま展開される
  echo '本文コンテンツ';
  include 'footer.php';
              │
              ▼
  header.php
  <?php
  // $title変数はmain.phpのスコープをそのまま引き継いで使える
  echo "<h1>{$title}</h1>";
              │
              ▼
  実行結果は、あたかもheader.phpの内容が
  main.phpのその場所に直接書かれていたかのように処理される

ポイントは、include されたファイルが呼び出し元のスコープ(変数など)をそのまま引き継いで実行されるという点です。これにより、設定値やテンプレート変数を柔軟に共有できますが、同時に変数名の衝突などに注意が必要になります。


実践サンプル7選

例1:基本的な使い方

<?php
// config.php の内容: <?php return ['app_name' => 'MyApp', 'debug' => true];

$config = include 'config.php';
print_r($config);

例2:共通ヘッダー・フッターを使い回すテンプレート構成

<?php
// header.php: <?php echo "<header>サイトヘッダー</header>\n";
// footer.php: <?php echo "<footer>サイトフッター</footer>\n";

function renderPage(string $content): void
{
    include __DIR__ . '/header.php';
    echo "<main>{$content}</main>\n";
    include __DIR__ . '/footer.php';
}

renderPage('ページの本文コンテンツ');

例3:ファイルが存在しない場合の挙動(警告が出るが処理は継続)

<?php

echo 'includeの前' . PHP_EOL;

// 存在しないファイルを指定すると、警告が出るがスクリプトは止まらない
include 'nonexistent_file.php';

echo 'includeの後(スクリプトは継続される)' . PHP_EOL;

例4:戻り値を使った設定ファイルの読み込みパターン

<?php
// settings.php: <?php return ['timezone' => 'Asia/Tokyo', 'locale' => 'ja_JP'];

class SettingsLoader
{
    public function load(string $path): array
    {
        $settings = include $path;

        // includeが失敗した場合、戻り値はfalseになる
        if ($settings === false) {
            throw new RuntimeException("設定ファイルの読み込みに失敗しました: {$path}");
        }

        return $settings;
    }
}

$loader = new SettingsLoader();
// print_r($loader->load(__DIR__ . '/settings.php'));

例5:ループ内でのinclude_once的な用法の比較

<?php
// plugin.php: <?php echo "プラグインが読み込まれました\n";

for ($i = 0; $i < 3; $i++) {
    // includeはループ内で呼ぶたびに毎回ファイルを再読み込み・再実行する
    include 'plugin.php';
}
// → "プラグインが読み込まれました" が3回出力される
// (クラスや関数の再定義を避けたい場合はinclude_onceを使うべき)

例6:変数スコープの共有を利用したビューレンダリング

<?php

class SimpleView
{
    /**
     * extract()で変数を展開してからincludeすることで、
     * テンプレートファイル内でそれらの変数を直接使えるようにする
     */
    public function render(string $templatePath, array $data = []): string
    {
        extract($data);
        ob_start();
        include $templatePath;
        return ob_get_clean();
    }
}

// greeting.php: <?php echo "こんにちは、{$name}さん!";
$view = new SimpleView();
// echo $view->render(__DIR__ . '/greeting.php', ['name' => '太郎']);

例7:条件に応じて異なるファイルを動的に読み込む

<?php

function loadEnvironmentConfig(string $env): array
{
    $path = __DIR__ . "/config/{$env}.php";

    if (!file_exists($path)) {
        $path = __DIR__ . '/config/default.php';
    }

    // ファイルパスは動的な文字列でも指定できる
    return include $path;
}

// $config = loadEnvironmentConfig(getenv('APP_ENV') ?: 'development');

関連機能との比較

構文役割includeとの違い
includeファイルを読み込み実行する本記事の対象。失敗時は警告のみで処理を継続する
requireファイルを読み込み実行する失敗時に致命的エラーとなり、スクリプトの実行が停止する
include_once同じファイルを一度だけ読み込む既に読み込み済みのファイルであれば再読み込みをスキップする
require_once同じファイルを一度だけ読み込む(厳格)requireの一度だけ版。クラス定義の重複読み込み防止に多用される
Composerのオートローダークラスを必要な時に自動的に読み込む仕組み明示的なinclude/requireを書かずに済む、現代的な代替手段

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

  1. ファイルが見つからなくても処理が止まらない
    これが require との最大の違いであり、最も注意すべき点です。include に失敗すると E_WARNING が発生しますが、スクリプトはそのまま次の行の実行を続けます。設定ファイルやクラス定義など、なくては処理が成立しないファイルの読み込みには require を使うべきです。
  2. 同じファイルを繰り返し読み込んでしまう
    クラスや関数が定義されたファイルを、ループや複数の箇所から include で何度も読み込むと、「関数の再定義」エラーなどを引き起こします。再読み込みを避けたい場合は include_once を使いましょう(例5を参照)。
  3. 変数スコープの共有による意図しない上書き
    include されたファイルは呼び出し元の変数スコープをそのまま使うため、同じ変数名を使っていると、意図せず値が上書きされることがあります。テンプレートのような用途では便利な反面、大規模なコードベースでは注意が必要です。
  4. 戻り値のfalseと、読み込んだファイルが明示的に返すfalseの区別が難しい
    include に失敗した場合の戻り値は false ですが、読み込んだファイル自体が意図的に return false; していた場合も同じ値になります。厳密な成功/失敗判定が必要な場合は、事前に file_exists() でファイルの存在を確認しておくと安全です(例4を参照)。
  5. 現代的なプロジェクトではComposerのオートローダーが優先される
    クラスの読み込みに関しては、現在はComposerの require __DIR__ . '/vendor/autoload.php'; という1行だけで、個々のクラスファイルへの include/require を明示的に書く必要がなくなっています。新規プロジェクトでクラスを管理する場合、オートローディングの活用を基本とし、include は設定ファイルやテンプレートなど、特定の用途に限定して使うのが現代的なスタイルです。

まとめ

観点まとめ
何をする構文か指定したファイルの内容をその場に読み込み、実行する
主な用途設定ファイルの読み込み、テンプレート(ヘッダー・フッターなど)の挿入
失敗時の挙動警告が発生するが、スクリプトの実行は継続される
requireとの違いrequireは失敗時に致命的エラーで停止する、より厳格な構文
注意点重複読み込みのリスク、変数スコープの共有、現代的にはオートローダーとの使い分けが重要

include は、PHPの最も基本的なファイル読み込み構文であり、「失敗しても処理を止めない」という性質から、オプショナルな設定の読み込みやテンプレートの挿入といった、柔軟性が求められる場面に適しています。一方で、「なくてはならない」重要なファイルの読み込みには、次回解説する require の方が適切です。

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