はじめに
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を書かずに済む、現代的な代替手段 |
よくある落とし穴(注意点)
- ファイルが見つからなくても処理が止まらない
これがrequireとの最大の違いであり、最も注意すべき点です。includeに失敗するとE_WARNINGが発生しますが、スクリプトはそのまま次の行の実行を続けます。設定ファイルやクラス定義など、なくては処理が成立しないファイルの読み込みにはrequireを使うべきです。 - 同じファイルを繰り返し読み込んでしまう
クラスや関数が定義されたファイルを、ループや複数の箇所からincludeで何度も読み込むと、「関数の再定義」エラーなどを引き起こします。再読み込みを避けたい場合はinclude_onceを使いましょう(例5を参照)。 - 変数スコープの共有による意図しない上書き
includeされたファイルは呼び出し元の変数スコープをそのまま使うため、同じ変数名を使っていると、意図せず値が上書きされることがあります。テンプレートのような用途では便利な反面、大規模なコードベースでは注意が必要です。 - 戻り値の
falseと、読み込んだファイルが明示的に返すfalseの区別が難しいincludeに失敗した場合の戻り値はfalseですが、読み込んだファイル自体が意図的にreturn false;していた場合も同じ値になります。厳密な成功/失敗判定が必要な場合は、事前にfile_exists()でファイルの存在を確認しておくと安全です(例4を参照)。 - 現代的なプロジェクトではComposerのオートローダーが優先される
クラスの読み込みに関しては、現在はComposerのrequire __DIR__ . '/vendor/autoload.php';という1行だけで、個々のクラスファイルへのinclude/requireを明示的に書く必要がなくなっています。新規プロジェクトでクラスを管理する場合、オートローディングの活用を基本とし、includeは設定ファイルやテンプレートなど、特定の用途に限定して使うのが現代的なスタイルです。
まとめ
| 観点 | まとめ |
|---|---|
| 何をする構文か | 指定したファイルの内容をその場に読み込み、実行する |
| 主な用途 | 設定ファイルの読み込み、テンプレート(ヘッダー・フッターなど)の挿入 |
| 失敗時の挙動 | 警告が発生するが、スクリプトの実行は継続される |
requireとの違い | requireは失敗時に致命的エラーで停止する、より厳格な構文 |
| 注意点 | 重複読み込みのリスク、変数スコープの共有、現代的にはオートローダーとの使い分けが重要 |
include は、PHPの最も基本的なファイル読み込み構文であり、「失敗しても処理を止めない」という性質から、オプショナルな設定の読み込みやテンプレートの挿入といった、柔軟性が求められる場面に適しています。一方で、「なくてはならない」重要なファイルの読み込みには、次回解説する require の方が適切です。
