Kodokon kodokon.com

コードを整理する:include、構造、定数

includeとrequireでサイトを再利用可能なファイルに分割し、明確なプロジェクト構造と、一元化された定数を手に入れましょう。

7 分 · 3 問

このレッスンを Kodokon で開く

サイトが二ページを超えて大きくなると、ヘッダー、フッター、関数をすべてのファイルで複製するのは手に負えなくなります。PHPには四つの取り込み命令があります。includerequire、そしてそれらのinclude_once / require_onceという変種です。どれも呼び出した位置にファイルの中身を挿入します。違いはエラー処理と繰り返しの取り込みにあります。_onceという変種は、すでに読み込んだファイルを覚えておき、一度だけ取り込みます。再宣言できない関数ファイルには欠かせません。

PHP
<?php

declare(strict_types=1);

function e(string $value): string
{
    return htmlspecialchars($value, ENT_QUOTES);
}

function formatPrice(float $amount): string
{
    return number_format($amount, 2, '.', ',') . ' €';
}
src/functions.php:サイト全体で再利用できるヘルパー。

明確なプロジェクト構造は、千のコメントに値します。よくある慣習はこうです。public/はブラウザに配信されるページを収めます(唯一公開されるフォルダです)。src/は設定と関数をまとめ、templates/はページの断片(header.phpfooter.php)を収めます。PHP組み込みの開発サーバーは、public/を指し示して起動します。

BASH
mkdir -p my-site/public my-site/src
mkdir -p my-site/templates
cd my-site
php -S localhost:8000 -t public
構造を作り、それから開発サーバーを起動する。

プロジェクトの固定値(サイト名、パス、設定)は、変数よりも定数にふさわしいものです。うっかり上書きされることがないからです。constはコンパイル時に、define()は実行時に解決されます。実際には、設定ファイルではconstを選びましょう。パスには常に、現在のファイルのフォルダである__DIR__を前に付けましょう。そうすれば、スクリプトがどこから起動されても取り込みが正しく動きます。

PHP
<?php

declare(strict_types=1);

const SITE_NAME = 'La Bonne Pizza';
const ITEMS_PER_PAGE = 12;
const UPLOAD_DIR = __DIR__ . '/../public/uploads';

define('BASE_URL', 'http://localhost:8000');
src/config.php:すべての設定を一か所に。

そうすると各ページは短い組み立て作業になります。requireで設定と関数を読み込み、それから固有の内容の周りにテンプレートを取り込むのです。

HTML
<?php
require __DIR__ . '/../src/config.php';
require_once __DIR__ . '/../src/functions.php';

$pageTitle = SITE_NAME . ' - Home';
include __DIR__ . '/../templates/header.php';
?>
<main>
  <h1><?= e($pageTitle) ?></h1>
  <p>Pizza of the day: <?= formatPrice(9.5) ?></p>
</main>
<?php include __DIR__ . '/../templates/footer.php'; ?>
public/index.php:ページはもはや組み立てにすぎない。

理解度チェック

このレッスンの要点をしっかり覚えているか確認しましょう。

  1. includeとrequireの違いは何ですか?
    • includeはrequireより速い
    • requireは絶対パスでしか動かない
    • requireはファイルがないとき致命的エラーでスクリプトを止め、includeは警告を出して続行する
    • 違いはない。二つは別名にすぎない
  2. require_onceは何のためのものですか?
    • 複数のファイルが要求しても、ファイルが一度だけ取り込まれることを保証するため
    • 本番環境でだけファイルを取り込むため
    • PHPコードを実行せずにファイルを取り込むため
  3. なぜ取り込みのパスに__DIR__を前置するのですか?
    • PHP 8以降は必須だから
    • パスが現在のファイルからの相対になり、スクリプトが起動されるフォルダに依存しなくなるから
    • 取り込んだファイルのキャッシュを有効にするから