関数・クラス・オブジェクト指向

PHP include関数とrequire関数の基本と違いを解説

PHPには、includerequireをはじめとした外部ファイルを読み込む関数が用意されています。

これらを活用することで、共通の処理をまとめて記述でき、コードの再利用やメンテナンスが容易になります。

本記事では、各関数の基本的な使い方と注意点について解説します。

PHP include/require関数の基本機能

関数の動作と違い

includeとrequireの基本動作

PHPのinclude関数は、指定したファイルの内容を読み込み、現在のスクリプトに展開します。

読み込み対象のファイルが存在しない場合、警告が表示されるものの、スクリプトの実行は継続されます。

一方、require関数は、対象ファイルが存在しないまたは読み込みに失敗したときに致命的なエラーを発生させ、後続のコードが実行されなくなります。

これにより、必要なファイルの確実な読み込みが保証される場面で利用されます。

以下は、includerequireの違いを示すサンプルコードです。

<?php
// sample_header.php
echo "ヘッダーの内容です\n";
?>
<?php
// include_sample.php
// 存在するファイル "sample_header.php" を読み込む例
include 'sample_header.php';
echo "include使用後の処理\n";
// 存在しないファイル "nonexistent.php" を読み込む例
include 'nonexistent.php';
echo "ファイルが見つからなくても、処理は継続されます\n";
?>
ヘッダーの内容です
include使用後の処理
Warning: include(nonexistent.php): failed to open stream: No such file or directory in /path/to/include_sample.php on line XX
Warning: include(): Failed opening 'nonexistent.php' for inclusion (include_path='.:/usr/share/php') in /path/to/include_sample.php on line XX
ファイルが見つからなくても、処理は継続されます
<?php
// require_sample.php
// 存在するファイル "sample_header.php" を読み込む例
require 'sample_header.php';
echo "require使用後の処理\n";
// 存在しないファイル "nonexistent.php" を読み込む例
require 'nonexistent.php';
echo "この行は実行されません\n";
?>
ヘッダーの内容です
require使用後の処理
Fatal error: require(): Failed opening required 'nonexistent.php' (include_path='.:/usr/share/php') in /path/to/require_sample.php on line XX

include_onceの特徴と使いどころ

include_once関数は、同一ファイルの重複読み込みを防止するために利用されます。

複数の場所から同じファイルを読み込む可能性がある場合、include_onceを使うことで、ファイルが一度しか読み込まれず、再定義エラーなどの問題を回避できます。

たとえば、設定ファイルや関数定義ファイルを複数のスクリプトで呼び出す場合に役立ちます。

以下は、include_onceを用いた例です。

<?php
// config.php
echo "設定ファイルを読み込みました\n";
?>
<?php
// main.php
include_once 'config.php';  // 初回の読み込み:ファイルの内容が出力される
include_once 'config.php';  // 2回目の読み込み:出力は行われないため、重複して表示されない
?>
設定ファイルを読み込みました

基本構文と利用例

構文の書き方

includeの基本構文

includeの基本的な構文は、以下のとおりです。

ファイルパスはシングルクォートまたはダブルクォートで指定します。

<?php
// sample_include.php
include 'path/to/file.php';  // ファイルの相対パスまたは絶対パスを指定
?>

この構文を使い、共通部分などを読み込むコードを書けば、メンテナンス性の向上につながります。

requireとの比較

requireの基本構文は、includeと非常に似ていますが、失敗時の動作が異なります。

以下の例では、必要なファイルが存在しない場合にスクリプト全体の実行が停止する点に注意してください。

<?php
// sample_require.php
require 'path/to/critical_file.php';  // このファイルは必須のため、安全に読み込めない場合は処理を中断
echo "このコードは、critical_file.php の読み込みが成功した場合のみ実行されます\n";
?>

この構文の違いを理解することで、システムに必要なファイルに対して適切な関数を選択できます。

実装例

ヘッダー・フッター分割によるコード共通化

ウェブサイト開発では、ヘッダーやフッター部分を別ファイルに分割し、各ページで共通利用することが一般的です。

この手法により、デザインの変更や保守作業が簡単になり、一度の修正で全ページに反映させることができます。

以下は、ヘッダーとフッターを分割して共通化する例です。

<?php
// header.php
echo "<html><body>\n";
echo "<header>サイトヘッダーの内容</header>\n";
?>
<?php
// footer.php
echo "<footer>サイトフッターの内容</footer>\n";
echo "</body></html>\n";
?>
<?php
// index.php
include 'header.php';  // ヘッダーの読み込み
echo "<main>メインコンテンツがここに入ります</main>\n";
include 'footer.php';  // フッターの読み込み
?>
<html><body>
<header>サイトヘッダーの内容</header>
<main>メインコンテンツがここに入ります</main>
<footer>サイトフッターの内容</footer>
</body></html>

複数ファイル統合の事例

プロジェクトが大規模化すると、各機能ごとにファイルを分割して管理することが望ましくなります。

モジュールごとにファイルを分け、必要なタイミングで各モジュールを読み込むことで、コードの整理がしやすくなり、保守性が向上します。

以下は、複数ファイルを統合して処理を行う例です。

<?php
// module1.php
echo "Module1 の初期処理\n";
?>
<?php
// module2.php
echo "Module2 の初期処理\n";
?>
<?php
// main.php
include 'module1.php';  // Module1 を読み込み
include 'module2.php';  // Module2 を読み込み
echo "複数モジュールの処理を統合しました\n";
?>
Module1 の初期処理
Module2 の初期処理
複数モジュールの処理を統合しました

ファイルパス指定と設定のポイント

パス指定の基礎知識

相対パスと絶対パスの使い分け

ファイルを読み込む際のパス指定には、相対パスと絶対パスがあります。

相対パスは、現在のスクリプトからの相対位置で指定する方法で、ディレクトリ構造の変更に柔軟に対応しやすいです。

一方、絶対パスはシステムのルートからのパスを指定する方法で、環境依存のリスクがありますが、明確な位置が決まっている場合に有用です。

以下は、パス指定を行う例です。

<?php
// 相対パスの使用例:現在のディレクトリからの相対位置で指定
include 'includes/config.php';
// 絶対パスの使用例:システムルートからのパスを指定
include '/var/www/html/includes/config.php';
?>

include_pathの設定方法

PHPではinclude_pathというディレクトリのリストを設定することができ、指定したディレクトリ内のファイルを優先的に検索する仕組みがあります。

これにより、プロジェクト内の共通ライブラリや設定ファイルを簡単に読み込むことが可能です。

set_include_path()関数やphp.iniの設定で指定できます。

以下は、include_pathの設定例です。

<?php
// 現在の include_path にライブラリディレクトリを追加する例
$newPath = '/path/to/library';
set_include_path(get_include_path() . PATH_SEPARATOR . $newPath);
include 'myLib.php';  // myLib.php が /path/to/library 内に存在する前提です
?>

エラー防止の工夫

ファイル存在チェックの方法

ファイルを読み込む前に存在チェックを行うことで、誤ったパス指定やファイル未配置によるエラーを未然に防ぐことができます。

PHPのfile_exists()関数を利用すると、ファイルの存在確認が可能です。

以下は、ファイル存在チェックを行う例です。

<?php
$file = 'data.php';
if (file_exists($file)) {
    include $file;
} else {
    echo "ファイルが存在しないため、読み込みをスキップします\n";
}
?>
ファイルが存在しないため、読み込みをスキップします

読み込み時のエラー対応

エラー表示がユーザーに露出しないようにするため、読み込み時のエラー対応策としてエラーハンドリングを実装することが有効です。

エラー表示を一時的に抑制する@演算子を利用する方法や、エラーチェック後に代替処理を実施する方法があります。

以下は、エラーチェックを行いつつ読み込みを試みる例です。

<?php
// エラー出力を一時的に抑制してファイルを読み込み、失敗時に代替処理を行う例
if (@include 'nonexistent.php') {
    echo "ファイルの読み込みに成功しました\n";
} else {
    echo "ファイル読み込みに失敗したため、代替処理を実行します\n";
}
?>
ファイル読み込みに失敗したため、代替処理を実行します

セキュリティと保守性への配慮

セキュリティ上の注意点

ファイルインジェクション対策

ユーザーからの入力値をそのままファイル名に使用すると、ファイルインジェクションのリスクが生じます。

許可されたファイル名のリストを用意し、ユーザー入力の値と照合することで、不正なファイルの読み込みを防ぐことが可能です。

以下は、ファイルインジェクション対策を実施する例です。

<?php
// 許可されたファイルのリスト
$allowedFiles = ['header.php', 'footer.php'];
// ユーザーからの入力値(例としてURLパラメータから取得)
$file = $_GET['file'] ?? 'header.php';
// 許可されたファイルかどうかチェック
if (in_array($file, $allowedFiles)) {
    include $file;
} else {
    echo "不正なファイルアクセスが検出されました\n";
}
?>
<header.php もしくは footer.php の内容が出力される>

外部からの不正アクセス防止

外部から直接アクセスされると困るファイル(設定ファイルやライブラリ)は、公開ディレクトリの外に配置するか、必要なアクセス制限を設けると安全です。

これにより、外部から不正な操作が行われるリスクを低減できます。

以下は、外部ディレクトリ内に配置されたファイルを読み込む例です。

<?php
// 外部ディレクトリに保管された安全な設定ファイルの読み込み例
include '../private/config.php';
echo "安全な外部ファイルを読み込みました\n";
?>
安全な外部ファイルを読み込みました

保守性向上の工夫

コード整理と更新時の影響低減

プロジェクトが大規模になると、各処理を個別のファイルに分割し、共通の処理は一箇所にまとめることで、コードの整理がしやすくなります。

たとえば、ヘッダーやフッター、共通ライブラリを一箇所にまとめ、各ページで必要に応じて読み込む設計にすることで、更新時の影響範囲を最小限に抑えられます。

以下は、共通ファイルをまとめて読み込む例です。

<?php
// common/header.php と common/footer.php を用いて、全ページの共通部分を管理する例
include 'common/header.php';
// ページ固有の処理
echo "<main>ページ固有のコンテンツ</main>\n";
include 'common/footer.php';
?>

冗長記述の削減方法

重複するコードが複数箇所に存在すると、メンテナンス性が低下します。

include_onceを利用して、同一のファイルを複数回読み込むのを防ぐとともに、共通処理をまとめて記述することで、冗長な記述を削減できます。

以下は、設定ファイルの重複読み込みを避けるための例です。

<?php
// settings/config.php に共通設定をまとめ、一度だけ読み込む例
include_once 'settings/config.php';
?>
<?php
// settings/config.php の内容が一度だけ出力される
?>

まとめ

この記事を通して、PHPのincludeやrequire関数の基本動作や構文、実用例について解説しました。

基本的な使い方からファイルパスの設定、エラー対応、セキュリティ対策まで、実務に直結する内容を整理して紹介しています。

ぜひ、今回の内容を参考にして、実際の開発環境でコードの共通化や保守性向上に取り組んでください。

関連記事

Back to top button
目次へ