Eine Konstante ist ein Name für einen Wert, der sich während der Laufzeit des Skripts nie ändert. Deklariere sie mit const MAX_USERS = 100; oder define('MAX_USERS', 100); und verwende dann den bloßen Namen, ohne $.
Konventionell werden Konstantennamen in UPPER_SNAKE_CASE geschrieben. Sie sind global: Eine Konstante, die am Anfang einer Datei deklariert wird, ist in jeder Funktion sichtbar, ohne global.
define() vs const
Beide erzeugen eine Konstante, aber zu verschiedenen Zeitpunkten. const wird aufgelöst, wenn PHP die Datei kompiliert, define() läuft wie jeder andere Funktionsaufruf.
const | define() | |
|---|---|---|
In if, Schleifen, Funktionen | Nein | Ja |
| Name aus einer Variable gebaut | Nein | Ja |
| Klassenkonstanten | Ja | Nein |
| Wert kann ein Ausdruck sein | Ja, aus Konstanten und Literalen | Ja, jeder Wert |
| Automatisch im Namespace | Ja | Nein (vollen Namen angeben) |
Verwende standardmäßig const, weil es kürzer ist und beim Kompilieren geprüft wird. Verwende define(), wenn die Konstante von einer Bedingung oder einem berechneten Namen abhängt.
Konstanten lassen sich nicht ändern
Einer Konstante etwas zuzuweisen ist ein Parse-Fehler:
<?php
const LIMIT = 10;
LIMIT = 20;
PHP Parse error: syntax error, unexpected token "=" in /home/index.php on line 3
Dieselbe Konstante zweimal zu definieren ist kein Fehler, aber PHP gibt eine Warnung aus und behält den ersten Wert:
<?php
define("LIMIT", 10);
define("LIMIT", 20);
echo LIMIT; // 10
Warning: Constant LIMIT already defined in /home/index.php on line 3
Wenn ein Wert schon gesetzt sein könnte (zum Beispiel in einer Konfigurationsdatei, die mehrmals geladen wird), prüfst du zuerst mit defined():
Konstante Arrays
Eine Konstante kann ein Array enthalten. Du kannst es mit NAME[key] lesen, darüber iterieren und es weitergeben, aber nicht ändern.
Klassenkonstanten
In einer Klasse deklariert const eine Konstante, die zur Klasse gehört. Von außen liest du sie mit ClassName::NAME, von innen mit self::NAME oder static::NAME. Klassenkonstanten können eine Sichtbarkeit haben, final sein und seit PHP 8.3 einen Typ deklarieren.
Eine Gruppe zusammengehöriger Klassenkonstanten wie STATUS_NEW und STATUS_PAID schreibt man oft besser als Enum, das außerdem verhindert, dass ungültige Werte weitergereicht werden.
Magische Konstanten: LINE, FILE, DIR und mehr
Magische Konstanten ändern ihren Wert je nachdem, wo sie stehen. Sie werden beim Kompilieren eingesetzt.
Am häufigsten wird __DIR__ verwendet, das Verzeichnis der aktuellen Datei. Include-Pfade, die darauf aufbauen, funktionieren egal, aus welchem Verzeichnis das Skript gestartet wurde: require __DIR__ . '/config.php';. Das vollständige Muster steht unter include und require.
Eingebaute Konstanten, die man kennen sollte
PHP definiert viele eigene Konstanten. Diese begegnen dir ständig:
PHP_EOL ist das Zeilenende des Systems, auf dem PHP läuft ("\n" unter Linux und macOS, "\r\n" unter Windows). Es ist für Text gedacht, der in Dateien und ins Terminal geschrieben wird; in HTML-Ausgabe ist ein Zeilenumbruch nicht sichtbar, verwende dort <br>.
Häufig gestellte Fragen
Was ist der Unterschied zwischen define() und const in PHP?
const ist ein Sprachkonstrukt, das beim Kompilieren der Datei aufgelöst wird: Es funktioniert auf oberster Ebene und in Klassen, aber nicht in if, Schleifen oder Funktionen. define() ist eine Funktion, die zur Laufzeit aufgerufen wird, funktioniert also überall, und der Name kann aus einer Variable gebaut werden, aber sie kann keine Klassenkonstanten deklarieren.
Kann eine PHP-Konstante ein Array sein?
Ja. Sowohl const COLORS = ['red', 'green']; als auch define('COLORS', ['red', 'green']); funktionieren, und ein Element liest du mit COLORS[0]. Das Array lässt sich danach nicht mehr ändern.
Wie prüfe ich in PHP, ob eine Konstante definiert ist?
Mit defined('NAME'), das den Namen als String nimmt und true oder false liefert. Ein gängiges Muster ist if (!defined('APP_ENV')) { define('APP_ENV', 'production'); }. Für Klassenkonstanten übergibst du 'ClassName::NAME'.
Was sind magische Konstanten in PHP?
Konstanten, deren Wert davon abhängt, wo sie stehen: __LINE__ (aktuelle Zeile), __FILE__ (vollständiger Pfad der Datei), __DIR__ (ihr Verzeichnis), __FUNCTION__, __CLASS__, __METHOD__ und __NAMESPACE__. Sie werden mit zwei Unterstrichen auf jeder Seite geschrieben und unterscheiden keine Groß- und Kleinschreibung.