PHP-Konstanten: Ein ausführlicher Leitfaden
Eine Konstante in PHP ist ein Wert, der nach seiner Festlegung nicht mehr geändert werden kann. Konstanten spielen eine wichtige Rolle in der Programmierung.
Eine Konstante in PHP ist ein benannter Wert, der nach seiner Definition nicht mehr geändert werden kann. Im Gegensatz zu Variablen werden Konstanten nicht mit einem $ vorangestellt, sie sind automatisch überall im Skript verfügbar (ohne Bereichsregeln), und jeder Versuch einer Neuzuweisung wird entweder ignoriert oder löst einen Fehler aus. Sie eignen sich ideal für feste Werte wie Konfigurationseinstellungen, API-Schlüssel, Versionsnummern und mathematische Grenzwerte.
Dieses Kapitel behandelt, wie Konstanten auf zwei verschiedene Arten definiert werden, die praktischen Unterschiede zwischen ihnen, magische Konstanten, Klassenkonstanten und häufige Fallstricke.
Eine Konstante definieren
PHP bietet zwei Werkzeuge: die Funktion define() und das Schlüsselwort const. Beide akzeptieren einen Namen und einen Wert.
<?php
// Using define()
define("SITE_NAME", "W3docs");
// Using the const keyword
const VERSION = "8.4";
echo SITE_NAME; // W3docs
echo PHP_EOL;
echo VERSION; // 8.4Konventionell werden Konstantennamen in GROSSBUCHSTABEN geschrieben, PHP erzwingt dies jedoch nicht. Ein gültiger Name beginnt mit einem Buchstaben oder Unterstrich, gefolgt von Buchstaben, Zahlen oder Unterstrichen — genau wie ein Variablenname, nur ohne das $.
Beachten Sie, dass Sie auf eine Konstante über ihren bloßen Namen (SITE_NAME) verweisen, nicht mit einem $. Konstanten sind Groß-/Kleinschreibungs-sensitiv: SITE_NAME und site_name sind zwei verschiedene Konstanten.
const vs define()
Beide erzeugen die gleiche Art von Konstante, verhalten sich jedoch auf Sprachebene unterschiedlich. Zu wissen, welche man verwenden sollte, vermeidet subtile Fehler:
const | define() | |
|---|---|---|
| Wird ausgewertet bei | Kompilierzeit | Laufzeit |
Innerhalb von if/Schleifen/Funktionen verwendbar | Nein (nur auf oberster Ebene / Klassenrumpf) | Ja |
| Name kann dynamisch aufgebaut werden | Nein | Ja (es ist nur ein String-Argument) |
| Funktioniert innerhalb von Klassen | Ja (definiert eine Klassenkonstante) | Nein |
Da define() zur Ausführungszeit läuft, ist es die richtige Wahl, wenn eine Konstante nur unter bestimmten Bedingungen existieren soll:
<?php
if (!defined("DEBUG")) {
define("DEBUG", true);
}
// define() can build the name dynamically — const cannot:
$key = "MAX_USERS";
define($key, 100);
echo MAX_USERS; // 100const, das zur Kompilierzeit ausgewertet wird, ist schneller und die übliche Wahl für Konstanten auf oberster Ebene in modernem Code.
Konstanten prüfen und lesen
Bevor Sie eine Konstante verwenden, deren Existenz unsicher ist, prüfen Sie sie mit defined(). Um den Wert einer Konstante abzurufen, wenn Sie ihren Namen nur als String kennen, verwenden Sie constant():
<?php
define("TIMEOUT", 30);
if (defined("TIMEOUT")) {
echo constant("TIMEOUT"); // 30
}Konstanten können Arrays enthalten
Seit PHP 7 sind Konstanten nicht auf Skalare (int, float, string, bool) beschränkt — sie können auch Arrays enthalten. Dies ist praktisch für feste Nachschlagetabellen:
<?php
const ALLOWED_ROLES = ["admin", "editor", "viewer"];
echo ALLOWED_ROLES[1]; // editorWeitere Informationen zu den gespeicherten Werttypen finden Sie unter PHP-Datentypen.
Magische Konstanten
PHP verfügt über magische Konstanten — vordefinierte Namen, deren Wert sich je nach Verwendungsort ändert. Sie werden mit führenden und abschließenden doppelten Unterstrichen geschrieben:
| Konstante | Auflösung |
|---|---|
__LINE__ | Die aktuelle Zeilennummer |
__FILE__ | Der vollständige Pfad der Datei |
__DIR__ | Das Verzeichnis der Datei |
__FUNCTION__ | Der Name der aktuellen Funktion |
__CLASS__ | Der Name der aktuellen Klasse |
__METHOD__ | Der Name der Klassenmethode |
<?php
function greet() {
echo "Called from: " . __FUNCTION__ . PHP_EOL;
echo "On line: " . __LINE__ . PHP_EOL;
}
greet();Klassenkonstanten
Konstanten, die innerhalb einer Klasse deklariert werden, gehören zur Klasse selbst, nicht zu einer Instanz. Deklarieren Sie sie mit const und greifen Sie mit dem Operator :: (Bereichsauflösung) darauf zu:
<?php
class Circle {
const PI = 3.14159;
public function area(float $r): float {
return self::PI * $r * $r;
}
}
echo Circle::PI; // 3.14159
echo PHP_EOL;
echo (new Circle)->area(2); // 12.56636Für eine tiefere Betrachtung lesen Sie PHP-Klassenkonstanten.
Konstanten vs. Variablen
Beide dienen unterschiedlichen Zwecken. Eine Variable enthält Daten, die sich voraussichtlich ändern; eine Konstante sperrt einen Wert fest. Die wichtigsten Unterschiede:
| Variable | Konstante | |
|---|---|---|
| Präfix | $name | NAME (kein Zeichen) |
| Neu zuweisbar | Ja | Nein |
| Geltungsbereich | Lokal, sofern nicht global gemacht | Automatisch global |
| Groß-/Kleinschreibung | Ja | Ja |
Verwenden Sie eine Konstante immer dann, wenn ein Wert für die gesamte Laufzeit festbleiben soll — Konfigurationsflags, Grenzwerte, feste Zeichenketten — damit er nicht versehentlich anderswo überschrieben werden kann.
Häufige Fallstricke
- Eine Konstante neu definieren.
define()zweimal auf denselben Namen anzuwenden, löst eine Warnung aus und behält den ersten Wert; eine erneute Deklaration mitconstist ein fataler Fehler. Konstanten sind einmalig schreibbar. - Das fehlende
$vergessen.echo $SITE_NAMEzu schreiben sucht nach einer undefinierten Variable, nicht nach Ihrer Konstante. - Undefinierte Konstanten. In PHP 8+ wirft die Verwendung eines undefinierten bloßen Wort-Konstantennamens einen
Error. Immerdefine()aufrufen, bevor Sie es verwenden, oder mitdefined()absichern.
Fazit
PHP-Konstanten bieten eine sichere Möglichkeit, Werte zu speichern, die sich niemals ändern dürfen: Definieren Sie sie mit const für gewöhnliche Konstanten auf oberster Ebene oder mit define(), wenn Sie Laufzeitlogik oder einen dynamischen Namen benötigen, gruppieren Sie feste Daten in Array- oder Klassenkonstanten, und nutzen Sie die eingebauten magischen Konstanten zum Debuggen. Richtig eingesetzt halten sie die Konfiguration an einem Ort und verhindern unbeabsichtigte Neuzuweisungen.