【PHP入門】include・requireの違いとファイル分割の基本

PHPのプログラムが長くなったら、ヘッダー、設定、関数などを別ファイルへ分けます。分割したファイルを読み込むために使うのが、includerequireです。

この記事では、4種類の読み込み方法の違い、__DIR__を使った安全なパス指定、簡単な画面分割を順番に解説します。

ファイルを分割する理由

  • 同じヘッダーやフッターを複数ページで再利用できる
  • 設定と画面表示を分けて整理できる
  • 一つのファイルが長くなりすぎるのを防げる
  • 変更する場所を見つけやすくできる

たとえば、次のような構成を考えます。

sample-app/
├── config.php
├── functions.php
├── header.php
├── footer.php
└── index.php

includeの基本

includeは、指定したファイルを読み込み、その場所で実行します。

<?php
// header.php
?>
<header>
    <h1>サンプルサイト</h1>
</header>
<?php
// index.php
$pageTitle = "トップページ";
include __DIR__ . "/header.php";
?>

<main>
    <h2><?= htmlspecialchars($pageTitle, ENT_QUOTES, "UTF-8") ?></h2>
</main>

header.phpの内容が、includeを書いた位置へ展開されます。

requireとの違い

includerequireの大きな違いは、ファイルを読み込めなかったときの動作です。

構文読み込み失敗時主な用途
include警告を出し、その後の処理を続けるなくても最低限動かせる表示部品
requireエラーになり、その後の処理を止める設定、関数、クラスなど必須ファイル
<?php
// 設定がないと処理できないためrequireを使う
require __DIR__ . "/config.php";

echo "アプリを開始します";

「このファイルがなければ正しく動かない」ときはrequireを選びます。

include_onceとrequire_once

include_oncerequire_onceは、同じファイルを一度だけ読み込みます。関数やクラスを重複して読み込むと再定義エラーになるため、共通処理にはrequire_onceがよく使われます。

<?php
// functions.php
function formatPrice(int $price): string
{
    return number_format($price) . "円";
}
<?php
require_once __DIR__ . "/functions.php";
require_once __DIR__ . "/functions.php"; // 2回目は読み込まれない

echo formatPrice(1500); // 1,500円

__DIR__で現在のファイルを基準にする

相対パスだけでrequire "config.php";と書くと、実行する場所によってファイルを見つけられない場合があります。__DIR__は、現在のPHPファイルが置かれたディレクトリを表します。

<?php
require_once __DIR__ . "/config.php";
require_once __DIR__ . "/functions.php";

親ディレクトリのファイルは__DIR__ . "/../config.php"のように指定できます。

設定値を配列として返す

読み込まれたファイルがreturnした値は、変数へ受け取れます。

<?php
// config.php
return [
    "site_name" => "PHP練習サイト",
    "items_per_page" => 10,
];
<?php
$config = require __DIR__ . "/config.php";

echo $config["site_name"];

ただし、データベースのパスワードなどの秘密情報を、公開ディレクトリやGit管理対象へ直接書かないようにしてください。本格的なアプリでは環境変数を利用します。

ヘッダーとフッターを共通化する

<?php
// index.php
$pageTitle = "商品一覧";
require __DIR__ . "/header.php";
?>

<main>
    <p>ここに商品一覧を表示します。</p>
</main>

<?php require __DIR__ . "/footer.php"; ?>

読み込んだファイルは、読み込み元の変数を参照できます。この例ではheader.phpから$pageTitleを利用できます。便利な一方、どの変数が必要なのか分かりにくくなりやすいため、変数名と役割を揃えましょう。

セキュリティ上の注意

ユーザー入力をファイル名にしない

次のようにURLパラメータをそのまま読み込みパスへ使ってはいけません。

<?php
// 危険な例:実際のアプリでは使用しない
$page = $_GET["page"] ?? "home";
include $page . ".php";

意図しないファイルを読み込まれる危険があります。必要なら、許可した値とファイルの対応表を用意します。

<?php
$allowedPages = [
    "home" => __DIR__ . "/pages/home.php",
    "about" => __DIR__ . "/pages/about.php",
];

$page = $_GET["page"] ?? "home";
$file = $allowedPages[$page] ?? $allowedPages["home"];

require $file;

4種類の使い分け

  • なくても処理を続けられる部品:include
  • 必ず必要なファイル:require
  • 重複読み込みを避けたい任意部品:include_once
  • 関数・クラス・設定など一度だけ必要:require_once

迷った場合、アプリに必須のPHPファイルはrequire_once __DIR__ . "/...";から始めると安全です。

練習問題

functions.phpに税込価格を返す関数を作り、index.phpから読み込んで1,000円の税込価格を表示してください。

解答例を見る
<?php
// functions.php
function addTax(int $price): int
{
    return (int) ($price * 1.1);
}
<?php
// index.php
require_once __DIR__ . "/functions.php";

echo number_format(addTax(1000)) . "円";

まとめ

  • 必須ファイルはrequire、処理を続けられる部品はinclude
  • 再定義を防ぐ場合はrequire_onceを使う
  • __DIR__を基準にパスを組み立てる
  • ユーザー入力を読み込みパスへ直接使わない

ファイル数が増えてきたら、手動読み込みを減らせるComposerとPSR-4オートロードへ進みましょう。

PHP学習ロードマップへ戻る

関連記事

コメント

この記事へのコメントはありません。