はじめに:なぜファイルを分割するの?
PHPでWebアプリケーションを開発していると、同じコード(例えばヘッダーやフッター、共通で使う関数など)を複数のページで使いたくなることがあります。そんな時、毎回同じコードをコピー&ペーストするのは大変ですし、修正が必要になった時に全てのファイルを変更しなければならず、ミスが発生しやすくなります。
そこで役立つのが、ファイルを分割して必要な場所で読み込む機能です。PHPには、外部ファイルを現在のスクリプトに読み込むための命令として include
と require
が用意されています。これらを使いこなすことで、コードの再利用性が高まり、管理しやすいアプリケーションを作ることができます。
このページでは、include
と require
の基本的な使い方と、それぞれの違い、そしてより安全に使うための include_once
と require_once
について学んでいきましょう!
include
:ファイルを読み込んで実行する
include
は、指定したファイルを読み込み、その内容を評価(実行)します。もし指定したファイルが見つからない場合、PHPは警告 (Warning) を発生させますが、スクリプトの実行は続行します。
基本的な使い方:
<?php
// header.php ファイルを読み込む
include 'header.php';
echo "<p>これはメインコンテンツです。</p>";
// footer.php ファイルを読み込む
include 'footer.php';
?>
例えば、header.php
にはサイトのヘッダー部分のHTMLとPHPコード、footer.php
にはフッター部分のコードが書かれているとします。include
を使うことで、これらの共通部分を簡単に他のページに組み込めます。
include
はファイルが見つからなくても処理を止めません。そのため、読み込んだファイルの内容に依存する処理が後続にある場合、予期せぬエラーにつながる可能性があります。
存在しないファイルを include した場合の例:
<?php
echo "<p>include 前</p>";
// わざと存在しないファイルを指定
include '存在しないファイルだよ.php';
// Warning が発生するが、この行は実行される
echo "<p>include 後</p>";
?>
このコードを実行すると、include
の行で “Warning: include(存在しないファイルだよ.php): Failed to open stream: No such file or directory” のような警告が表示されますが、「include 後」の文字列は表示されます。
require
:必須ファイルを読み込む
require
も include
と同様に、指定したファイルを読み込み、その内容を評価(実行)します。しかし、require
は指定したファイルが見つからない場合、致命的なエラー (Fatal Error) を発生させ、スクリプトの実行を停止します。
アプリケーションの動作に不可欠なファイル(例えば、設定ファイルやデータベース接続ファイル、必須関数の定義ファイルなど)を読み込む場合に require
を使用します。
基本的な使い方:
<?php
// データベース接続設定ファイルを読み込む (このファイルがないと動作しない)
require 'config.php';
// 共通関数ファイルを読み込む
require 'functions.php';
// データベースに接続
$pdo = connectDatabase($dbConfig);
echo "<p>データベースに接続しました。</p>";
?>
もし config.php
や functions.php
が見つからない場合、require
はエラーを出して処理を中断するため、未定義の変数や関数を使おうとしてさらなるエラーが発生するのを防ぐことができます。
存在しないファイルを require した場合の例:
<?php
echo "<p>require 前</p>";
// わざと存在しないファイルを指定
require '絶対に必要だけど存在しないファイル.php';
// Fatal error が発生するため、この行は実行されない
echo "<p>require 後</p>";
?>
このコードを実行すると、require
の行で “Fatal error: require(): Failed opening required ‘絶対に必要だけど存在しないファイル.php’ (include_path=…)” のようなエラーが表示され、スクリプトはその場で停止します。「require 後」の文字列は表示されません。
include
vs require
:違いのまとめ
include
と require
の主な違いは、ファイルが見つからなかった場合の挙動です。どちらを使うかは、そのファイルの重要度によって判断しましょう。
機能 | include |
require |
---|---|---|
ファイルの読み込み | 行う | 行う |
ファイルが見つからない場合 | 警告 (Warning) を発生 | 致命的なエラー (Fatal Error) を発生 |
スクリプトの実行 | 続行する | 停止する |
主な用途 | テンプレートファイル(ヘッダー、フッターなど)、オプション機能のファイル | 設定ファイル、必須関数ファイル、クラス定義ファイルなど、動作に不可欠なファイル |
include_once
と require_once
:重複読み込みを防ぐ
複雑なアプリケーションでは、意図せずに同じファイルを複数回読み込んでしまうことがあります。特に関数やクラスを定義しているファイルを複数回読み込むと、「Cannot redeclare function (関数を再定義できません)」や「Cannot declare class (クラスを宣言できません)」といったエラーが発生する可能性があります。
このような問題を避けるために、include_once
と require_once
が用意されています。
include_once
:include
と同様の動作ですが、指定されたファイルが既に読み込まれているかチェックし、まだ読み込まれていない場合のみ読み込みます。require_once
:require
と同様の動作ですが、指定されたファイルが既に読み込まれているかチェックし、まだ読み込まれていない場合のみ読み込みます。
基本的に、関数定義やクラス定義を含むファイルを読み込む場合は、_once
が付いたバージョンを使用することが推奨されます。
基本的な使い方:
<?php
// functions.php を読み込む (まだ読み込まれていなければ)
require_once 'functions.php';
// 何らかの処理 ...
// 再度 functions.php を読み込もうとしても、require_once なので無視される
require_once 'functions.php';
// template_parts.php を読み込む (まだ読み込まれていなければ)
include_once 'template_parts.php';
// 何らかの処理 ...
// 再度 template_parts.php を読み込もうとしても、include_once なので無視される
include_once 'template_parts.php';
echo "<p>関数の呼び出し: " . htmlspecialchars(myFunction(), ENT_QUOTES, 'UTF-8') . "</p>";
?>
_once
版は、読み込む前に既に読み込まれているかのチェック処理が入るため、わずかにパフォーマンスのオーバーヘッドがあります。しかし、現代のPHP実行環境ではその差は非常に小さいため、重複読み込みによるエラーを防ぐメリットの方が大きい場合がほとんどです。迷ったら _once
を使うのが安全です。
パスの指定方法
ファイルを読み込む際には、そのファイルの場所(パス)を正しく指定する必要があります。主な指定方法には相対パスと絶対パスがあります。
- 相対パス: 現在のスクリプトファイルからの相対的な位置で指定します。
include 'header.php';
(同じディレクトリにある場合)include 'includes/functions.php';
(サブディレクトリincludes
の中にある場合)include '../config.php';
(一つ上のディレクトリにある場合)
- 絶対パス: サーバのルートディレクトリからの完全なパスで指定します。可搬性が低くなることがあるため、通常はあまり使いませんが、
$_SERVER['DOCUMENT_ROOT']
などのスーパーグローバル変数と組み合わせて使うことがあります。include '/var/www/html/project/includes/config.php';
(Linuxサーバーの例)include $_SERVER['DOCUMENT_ROOT'] . '/includes/config.php';
(Webルートからのパス)
- マジック定数
__DIR__
: 現在のファイルが存在するディレクトリの絶対パスを表すマジック定数です。これを使うと、スクリプトがどこから実行されても、そのスクリプトファイルからの相対的な位置にあるファイルを確実に指定できます。推奨される方法です。require_once __DIR__ . '/../vendor/autoload.php';
(一つ上のディレクトリのvendor
内のautoload.php
を読み込む例)include __DIR__ . '/partials/header.php';
(同じ階層のpartials
ディレクトリ内のheader.php
を読み込む例)
まとめ
今回は、PHPでファイルを読み込むための include
, require
, include_once
, require_once
について学びました。
- コードの再利用と管理のためにファイルを分割し、必要な場所で読み込みます。
include
はファイルがなくても警告のみで処理を続行します。オプション的なファイルの読み込みに適しています。require
はファイルがないと致命的エラーで処理を停止します。必須ファイルの読み込みに適しています。include_once
とrequire_once
は、ファイルの重複読み込みを防ぎます。関数やクラス定義ファイルの読み込みに推奨されます。- パスの指定には、マジック定数
__DIR__
を使うと、スクリプトの実行場所によらず安定してファイルを指定できます。
これらの機能をうまく使って、効率的でメンテナンスしやすいPHPコードを書いていきましょう!