PHPのプログラムが長くなったら、ヘッダー、設定、関数などを別ファイルへ分けます。分割したファイルを読み込むために使うのが、includeとrequireです。
この記事では、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との違い
includeとrequireの大きな違いは、ファイルを読み込めなかったときの動作です。
| 構文 | 読み込み失敗時 | 主な用途 |
|---|---|---|
include | 警告を出し、その後の処理を続ける | なくても最低限動かせる表示部品 |
require | エラーになり、その後の処理を止める | 設定、関数、クラスなど必須ファイル |
<?php
// 設定がないと処理できないためrequireを使う
require __DIR__ . "/config.php";
echo "アプリを開始します";
「このファイルがなければ正しく動かない」ときはrequireを選びます。
include_onceとrequire_once
include_onceとrequire_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オートロードへ進みましょう。
コメント