Kodokon kodokon.com

Deinen Code organisieren: include, Struktur, Konstanten

Teile deine Website mit include und require in wiederverwendbare Dateien auf, mit klarer Projektstruktur und zentralen Konstanten.

7 Min. · 3 Fragen

Diese Lektion in Kodokon öffnen

Sobald deine Website über zwei Seiten hinauswächst, wird es unhaltbar, Kopfzeile, Fußzeile und Funktionen in jeder Datei zu duplizieren. PHP bietet vier Einbindungsanweisungen: include, require und ihre Varianten include_once / require_once. Alle fügen den Inhalt einer Datei an der Stelle des Aufrufs ein; der Unterschied liegt in der Fehlerbehandlung und bei wiederholten Einbindungen. Die _once-Varianten merken sich die bereits geladenen Dateien und binden sie nur einmal ein - unverzichtbar für Funktionsdateien, die nicht erneut deklariert werden dürfen.

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: Hilfsfunktionen, die auf der ganzen Website wiederverwendbar sind.

Eine klare Projektstruktur ist mehr wert als tausend Kommentare. Eine verbreitete Konvention: public/ enthält die Seiten, die an den Browser ausgeliefert werden (es ist der einzige offengelegte Ordner), src/ sammelt Konfiguration und Funktionen, templates/ enthält Seitenfragmente (header.php, footer.php). Den in PHP eingebauten Entwicklungsserver startest du, indem du ihn auf public/ zeigen lässt.

BASH
mkdir -p my-site/public my-site/src
mkdir -p my-site/templates
cd my-site
php -S localhost:8000 -t public
Die Struktur anlegen und dann den Entwicklungsserver starten.

Die festen Werte des Projekts (Name der Website, Pfade, Einstellungen) verdienen Konstanten statt Variablen: Sie können nicht versehentlich überschrieben werden. const wird zur Kompilierzeit aufgelöst, define() zur Laufzeit; in der Praxis bevorzugst du const in deinen Konfigurationsdateien. Stelle Pfaden immer __DIR__ voran, den Ordner der aktuellen Datei: So funktionieren deine Einbindungen, egal von wo aus das Skript gestartet wird.

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: die gesamte Konfiguration an einem Ort.

Jede Seite wird damit zu einer kurzen Montage: Konfiguration und Funktionen mit require laden und dann die Templates rund um den eigentlichen Inhalt einbinden.

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: die Seite ist jetzt nur noch eine Montage.

Wissenscheck

Stelle sicher, dass du die wichtigsten Punkte dieser Lektion behalten hast.

  1. Was ist der Unterschied zwischen include und require?
    • include ist schneller als require
    • require funktioniert nur mit absoluten Pfaden
    • require stoppt das Skript mit einem fatalen Fehler, wenn die Datei fehlt, include gibt eine Warnung aus und läuft weiter
    • Keiner, das sind zwei Aliasse
  2. Wofür ist require_once da?
    • Um sicherzustellen, dass eine Datei nur einmal eingebunden wird, selbst wenn mehrere Dateien sie anfordern
    • Um eine Datei nur in der Produktion einzubinden
    • Um eine Datei einzubinden, ohne ihren PHP-Code auszuführen
  3. Warum sollte man Einbindungspfaden __DIR__ voranstellen?
    • Seit PHP 8 ist das Pflicht
    • Der Pfad wird relativ zur aktuellen Datei und hängt nicht mehr vom Ordner ab, aus dem das Skript gestartet wird
    • Es aktiviert einen Cache für eingebundene Dateien