[PHPのはじめ方] Part8: include, requireによるファイル読み込み

はじめに:なぜファイルを分割するの?

PHPでWebアプリケーションを開発していると、同じコード(例えばヘッダーやフッター、共通で使う関数など)を複数のページで使いたくなることがあります。そんな時、毎回同じコードをコピー&ペーストするのは大変ですし、修正が必要になった時に全てのファイルを変更しなければならず、ミスが発生しやすくなります。

そこで役立つのが、ファイルを分割して必要な場所で読み込む機能です。PHPには、外部ファイルを現在のスクリプトに読み込むための命令として includerequire が用意されています。これらを使いこなすことで、コードの再利用性が高まり、管理しやすいアプリケーションを作ることができます。

このページでは、includerequire の基本的な使い方と、それぞれの違い、そしてより安全に使うための include_oncerequire_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:必須ファイルを読み込む

requireinclude と同様に、指定したファイルを読み込み、その内容を評価(実行)します。しかし、require は指定したファイルが見つからない場合、致命的なエラー (Fatal Error) を発生させ、スクリプトの実行を停止します。

アプリケーションの動作に不可欠なファイル(例えば、設定ファイルやデータベース接続ファイル、必須関数の定義ファイルなど)を読み込む場合に require を使用します。

基本的な使い方:

<?php
// データベース接続設定ファイルを読み込む (このファイルがないと動作しない)
require 'config.php';

// 共通関数ファイルを読み込む
require 'functions.php';

// データベースに接続
$pdo = connectDatabase($dbConfig);

echo "<p>データベースに接続しました。</p>";
?>

もし config.phpfunctions.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:違いのまとめ

includerequire の主な違いは、ファイルが見つからなかった場合の挙動です。どちらを使うかは、そのファイルの重要度によって判断しましょう。

機能 include require
ファイルの読み込み 行う 行う
ファイルが見つからない場合 警告 (Warning) を発生 致命的なエラー (Fatal Error) を発生
スクリプトの実行 続行する 停止する
主な用途 テンプレートファイル(ヘッダー、フッターなど)、オプション機能のファイル 設定ファイル、必須関数ファイル、クラス定義ファイルなど、動作に不可欠なファイル

include_oncerequire_once:重複読み込みを防ぐ

複雑なアプリケーションでは、意図せずに同じファイルを複数回読み込んでしまうことがあります。特に関数やクラスを定義しているファイルを複数回読み込むと、「Cannot redeclare function (関数を再定義できません)」や「Cannot declare class (クラスを宣言できません)」といったエラーが発生する可能性があります。

このような問題を避けるために、include_oncerequire_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>";
?>
Tips: _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_oncerequire_once は、ファイルの重複読み込みを防ぎます。関数やクラス定義ファイルの読み込みに推奨されます。
  • パスの指定には、マジック定数 __DIR__ を使うと、スクリプトの実行場所によらず安定してファイルを指定できます。

これらの機能をうまく使って、効率的でメンテナンスしやすいPHPコードを書いていきましょう!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です