【PHP】includeの使い方とrequireとの違いを実例で解説

【PHP】includeの使い方とrequireとの違いを実例で解説
公開日: 2023/06/09
/
更新日: 2023/06/09
目次

Web開発でよくあるシーンですが、「ヘッダーやフッターの部分を複数ページで共有したい」と思ったことはありませんか?

そんなときに便利なのが、PHPのincludeです。

includeを使えば、同じコードを複数のファイルで繰り返し書かずに、効率的にコードを再利用できます。

PHPのincludeの使い方

PHPのincludeは、外部ファイルを組み込める関数です。

以下のようなheader.phpというファイルがあるとします。

<header>
    <h1>Welcome to my website!</h1>
</header>

このheader.phpファイルを別のファイル、たとえばindex.phpで組み込む場合、以下のようにincludeを使用します。

<!DOCTYPE html>
<html>
<head>
    <title>My Website</title>
</head>
<body>
    // includeを使う
    <?php include 'header.php'; ?>
    
    <section>
        <h2>About Me</h2>
        <p>I am a web developer.</p>
    </section>
</body>
</html>

このindex.phpを表示させると以下のようになります(追加でCSSでスタイルを当てています)。

PHPのincludeを使った例

<?php include 'header.php'; ?>で、外部ファイルのheader.phpを読み込んでいます。

そのほかにfooter.phpsidebar.phpなど、セクションごとにコードを分けることで、複数ページで共通化できたり、メンテナンスしやすくなったりします。

ディレクトリ構造がある場合の使い方

例として、ディレクトリ構造が以下のようになっているとします。

- index.php
- includes/
    - config/
        - database.php
    - functions/
        - helper.php
    - templates/
        - header.php
        - footer.php

index.phpファイルでincludesディレクトリ以下のファイルを絶対パスで読み込むには、以下のようにします。

<?php
// includes/config/database.php を読み込む
include __DIR__ . '/includes/config/database.php';

// includes/functions/helper.php を読み込む
include __DIR__ . '/includes/functions/helper.php';

// includes/templates/header.php を読み込む
include __DIR__ . '/includes/templates/header.php';

// メインのコード
// ...

// includes/templates/footer.php を読み込む
include __DIR__ . '/includes/templates/footer.php';
?>

ここでは、__DIR__という「マジック定数」で、現在のディレクトリを基準にした絶対パスを指定しています。

__DIR__を使用することで、たとえば別環境に変わってディレクトリの構造が変更されても、パスの指定を修正する必要がありません。

PHPのincludeの役割と使用ケース

PHPのincludeは、主に以下のような役割があります。

includeの役割
  • テンプレートの再利用
  • 関数やクラスの定義、定数の宣言などの再利用
  • コードのモジュール化

テンプレートの再利用

先に紹介したヘッダーの例のように、テンプレートを複数ファイルで再利用できるようになります。

たとえばホームページの場合、ヘッダー、ナビゲーションメニュー、フッター、サイドバーなどは、トップページ以外のページでも共通して必要です。

複数ページのソースコードに同じコードを書くのは、面倒でメンテナンス性もよくないため、外部ファイルが読み込めるincludeが役立ちます。

関数やクラスの定義、定数の宣言などの再利用

関数やクラスの定義、定数の宣言などを再利用するために、includeを使用できます。

たとえば、以下のような関数用のファイルmath_functions.phpがあるとします。

<?php
function calculate_sum($a, $b) {
    return $a + $b;
}

class Circle {
    const PI = 3.14159;
    private $radius;

    public function __construct($radius) {
        $this->radius = $radius;
    }

    public function calculate_area() {
        return self::PI * $this->radius * $this->radius;
    }
}
?>

math_functions.phpファイルでは、以下の3つが定義されています。

  • calculate_sumという関数
  • Circleというクラス
  • Circleクラスの定数PI

次に、math_functions.phpを読み込むindex.phpが以下です。

<!DOCTYPE html>
<html>
<head>
    <title>My Website</title>
</head>
<body>
    <?php include 'math_functions.php'; ?>
    
    <h2>5 + 3は: <?php echo calculate_sum(5, 3); ?></h2>
    
    <h2>半径2の円の面積は: <?php
        $circle = new Circle(2);
        echo $circle->calculate_area();
    ?></h2>
</body>
</html>

表示させると以下のようになります。

関数やクラスの定義、定数の宣言などの再利用

上記のindex.phpファイルでは、math_functions.phpincludeを使って組み込んでいます。

まず、<?php include 'math_functions.php'; ?>により、math_functions.phpファイルの中身が読み込まれ、定義した3つが利用可能になります。

index.phpでは、calculate_sum関数を呼び出して5と3の和を表示し、またCircleクラスを使用して半径2の円の面積を計算して表示しています。

このように、includeを使用することで、関数やクラスの定義、定数の宣言などを別のファイルで定義し、必要な場所で再利用できます。

コードのモジュール化

includeを使用してコードをモジュール化することで、可読性の高い、再利用可能なコードを作成できます。

モジュール化とは

PHPにおけるコードのモジュール化とは、プログラムを複数の独立した部品(モジュール)に分割し、それぞれの部品を個別に作成・管理・再利用できるようにすることです。

具体的には、関数やクラス、定数などをグループにまとめ、コードがより独立した機能を持つ小さな部品に分割します。これにより、それぞれが単一の責務を担う点がポイントです。

モジュール化によって、コードの保守性、可読性、再利用性が向上し、開発の効率性も高まります。

具体例として、ユーザー認証機能やデータベース接続機能など、複数の機能があるWebアプリケーションを開発しているとします。

まず、ユーザー認証機能をauthentication.phpというファイルにモジュール化するイメージが以下です。

<?php
function authenticate_user($username, $password) {
    // ユーザー認証のロジック
    // ...
}

function is_user_logged_in() {
    // ユーザーがログインしているかどうかをチェックする処理
    // ...
}

function logout_user() {
    // ユーザーのログアウト処理
    // ...
}
?>

次に、データベース接続機能をdatabase.phpというファイルにモジュール化。

<?php
function connect_to_database() {
    // データベースに接続する処理
    // ...
}

function execute_query($query) {
    // クエリを実行する処理
    // ...
}

function close_database_connection() {
    // データベース接続をクローズする処理
    // ...
}
?>

これで、ユーザー認証機能とデータベース接続機能がそれぞれ別のファイルにモジュール化されました。

これらの機能を使って実際のページを作成するindex.phpの例が以下です。

<?php
include 'authentication.php';
include 'database.php';

if (is_user_logged_in()) {
    echo "Welcome, " . $_SESSION['username'];
} else {
    echo "Please log in.";
}
?>

index.phpでは、authentication.phpとdatabase.phpをincludeを使って組み込んでいます。そして、is_user_logged_in()関数を使ってユーザーがログインしているかどうかをチェックし、それに応じてメッセージを表示しています。

このように、includeを使用して機能ごとにコードをモジュール化することで、コードが整理されます。

ユーザー認証機能をメンテナンスしたい場合は、authentication.phpを見ればよいですね。

このように機能別にコードを部品のように分けることで、保守性が向上し、特定の機能を修正・拡張する際にも影響範囲が限定されます。

PHPのincludeとrequireの違い

PHPのincluderequireはどちらも、外部ファイルを読み込む関数です。

主な違いは、ファイルが見つからなかった場合の動作とエラーハンドリングの方法です。

include

指定された外部ファイルを読み込み。
もしファイルが見つからなかった場合、警告メッセージが表示されるが、スクリプトの実行は継続される。
includeによって読み込まれるファイルはオプション扱い。

require

指定された外部ファイルを読み込み(ここまでincludeと同じ)。
ファイルが見つからない場合に致命的なエラー(Fatal Error)が発生し、スクリプトの実行が停止される。
requireによって読み込まれるファイルは必須扱い。

includeの例

<?php
// includeの例
include 'file1.php';
echo 'This is the main file.';
?>

file1.phpが存在しない場合、警告メッセージが表示されますが、スクリプトの実行は続行されます。つまりThis is the main file.が表示されます。

実際の画面が以下です。

PHPのincludeの使用例エラー画面
▲ file1.phpが見つからないと警告メッセージが出る
PHPのincludeの使用例出力画面
▲ 警告は出るが、「This is the main file.」は表示される

以上のように、includeはファイルが存在しなくても処理を継続したい場合に使用されます。

requireの例

<?php
// requireの例
require 'file2.php';
echo 'This is the main file.';
?>

file2.phpが存在しない場合、致命的なエラーが発生し、スクリプトの実行が停止されます。つまり、エラーメッセージが表示されますが、This is the main file.は表示されません。

実際の画面が以下です。

PHPのrequireの使用例エラー画面
▲ includeの場合とエラーメッセージが異なる
PHPのrequireの使用例出力画面
▲ エラーによりechoが出力されない

requireは必ずファイルが存在していることを前提とし、エラーが発生した場合はスクリプトの実行を停止したい場合に使用されます。

include_onceとrequire_once

同じファイルを複数回読み込むことを防ぐinclude_oncerequire_onceという関数も存在します。

ファイルがすでに読み込まれている場合は再度読み込まれず、スキップされます。