const
Das Schlüsselwort const in PHP ermöglicht die Definition von Konstanten – sowohl global als auch in Klassen – die zur Kompilierzeit festgelegt werden.
Das PHP-Schlüsselwort const
Eine Konstante ist ein benannter Wert, der sich während der Ausführung eines Skripts nicht verändert. Das Schlüsselwort const ist eine von zwei Möglichkeiten in PHP, eine Konstante zu deklarieren (die andere ist die Funktion define()). Anders als eine Variable hat eine Konstante kein vorangestelltes $, und sobald sie gesetzt ist, kann sie weder neu zugewiesen noch mit unset() aufgehoben werden.
Dieser Leitfaden erläutert, was const bewirkt, wie es sich von define() unterscheidet, wo es verwendet werden darf und welche häufigen Fallstricke es gibt.
Syntax
const kann auf der obersten Ebene eines Skripts (eine globale Konstante) oder innerhalb einer Klasse, eines Interfaces oder eines Traits (eine Klassenkonstante) verwendet werden:
const NAME = value; // global constantclass ClassName {
const NAME = value; // class constant, accessed as ClassName::NAME
}Per Konvention werden Konstantennamen in UPPER_SNAKE_CASE geschrieben. Ein Name muss mit einem Buchstaben oder Unterstrich beginnen und darf nur Buchstaben, Ziffern und Unterstriche enthalten.
const vs. define()
PHP bietet zwei Werkzeuge, die ähnlich aussehen, sich aber unterschiedlich verhalten. Die Kenntnis der Unterschiede spart Debugging-Zeit:
| Merkmal | const | define() |
|---|---|---|
| Auswertung | Zur Kompilierzeit | Zur Laufzeit |
Bedingte Ausführung (innerhalb von if) | Nein | Ja |
| Verwendung innerhalb einer Klasse | Ja (Klassenkonstante) | Nein |
| Name aus einer Variable/einem Ausdruck | Nein | Ja (define($name, ...)) |
| Wert | Nur konstante Ausdrücke | Jeder Ausdruck |
Faustregel: Verwenden Sie const für feste, immer definierte Werte (insbesondere Klassenkonstanten) und define(), wenn Name oder Wert erst zur Laufzeit bestimmt werden.
<?php
// define() can be conditional; const cannot.
if (!defined('ENVIRONMENT')) {
define('ENVIRONMENT', 'production');
}
// This would be a fatal parse error — const cannot live inside an if-block:
// if (true) { const FOO = 1; }Weitere Informationen finden Sie im dedizierten Kapitel zu define() und in der Übersicht über PHP-Konstanten.
Beispiele
Klassenkonstante und globale Konstante
<?php
// Example 1 — a class constant referenced with self::
class Circle
{
const PI = 3.14;
public $radius;
public function __construct($radius)
{
$this->radius = $radius;
}
public function getArea()
{
return self::PI * $this->radius * $this->radius;
}
}
$myCircle = new Circle(5);
echo "Area of circle: " . $myCircle->getArea() . PHP_EOL;
// Output: Area of circle: 78.5
// Example 2 — a global constant
const MY_NAME = "John";
echo "My name is " . MY_NAME;
// Output: My name is JohnEine Klassenkonstante wird mit dem Operator :: (Scope-Resolution-Operator) gelesen — self::PI von innerhalb der Klasse und Circle::PI von außerhalb. Eine globale Konstante wird direkt beim Namen ohne $ verwendet. Weitere Informationen zu Klassen finden Sie unter PHP-Klassen und -Objekte und im Kapitel zu Klassenkonstanten.
Konstante Ausdrücke und Arrays
Ein const-Wert muss ein konstanter Ausdruck sein — etwas, das PHP auswerten kann, ohne Code auszuführen. Es dürfen Literale, Operatoren und bereits definierte Konstanten verwendet werden, und (seit PHP 5.6) kann das Ergebnis auch ein array sein.
<?php
const SECONDS_PER_MINUTE = 60;
const SECONDS_PER_HOUR = SECONDS_PER_MINUTE * 60; // built from another const
const ALLOWED_ROLES = ['admin', 'editor', 'viewer'];
echo SECONDS_PER_HOUR . PHP_EOL; // 3600
echo ALLOWED_ROLES[1] . PHP_EOL; // editorFunktionsaufrufe und Objektinstanzen sind in einem const-Wert nicht erlaubt, da sie zur Kompilierzeit nicht aufgelöst werden können.
Klassenkonstanten: Sichtbarkeit, Interfaces und final
Klassenkonstanten gehören zur Klasse, nicht zu einem einzelnen Objekt — daher ist keine Instanz erforderlich, um sie zu lesen. Seit PHP 7.1 können ihnen auch Sichtbarkeitsmodifikatoren zugewiesen werden:
<?php
interface HasStatus
{
// Interface constants are always public.
const DEFAULT_STATUS = 'pending';
}
class Order implements HasStatus
{
public const TAX_RATE = 0.2; // readable everywhere
protected const MAX_QTY = 99; // this class + subclasses
private const SECRET = 'x'; // this class only
public function status(): string
{
return self::DEFAULT_STATUS; // inherited from the interface
}
}
echo Order::TAX_RATE . PHP_EOL; // 0.2
echo (new Order())->status() . PHP_EOL; // pendingInterfaces können ebenfalls Konstanten deklarieren (immer public) — siehe PHP-Interfaces. Eine Klassenkonstante kann seit PHP 8.1 als final markiert werden, um zu verhindern, dass Unterklassen sie überschreiben.
Häufige Fallstricke
- Kein
$vor einer Konstanten.echo MY_NAME;funktioniert;echo $MY_NAME;sucht nach einer Variablen und schlägt fehl. - Kann nicht geändert oder aufgehoben werden. Das Neuzuweisen einer Konstante ist ein fataler Fehler;
unset()funktioniert bei Konstanten nicht. - Nur zur Kompilierzeit.
constkann nicht in einif, eine Schleife oder eine Funktion eingebettet werden, die auf Laufzeitdaten basiert — verwenden Sie dafürdefine(). - Konstanten sind global sichtbar. Eine globale
const-Konstante ist innerhalb von Funktionen sichtbar, ohneglobalverwenden zu müssen — anders als eine normale Variable.
Vorteile
- Lesbarkeit: Eine benannte Konstante wie
TAX_RATEdokumentiert die Absicht weit besser als eine magische Zahl. - Wartbarkeit: Ein Wert muss nur an einer Stelle geändert werden, anstatt jeden Literalwert im Code zu suchen.
- Sicherheit: Der Wert ist schreibgeschützt und kann im Code nicht versehentlich überschrieben werden.
Fazit
Das Schlüsselwort const definiert Konstanten zur Kompilierzeit — sowohl global als auch innerhalb von Klassen —, die für die gesamte Lebensdauer eines Skripts unveränderlich bleiben. Verwenden Sie es für feste Werte, die von Anfang an bekannt sind, bevorzugen Sie Klassenkonstanten für Werte, die zu einem Typ gehören, und wechseln Sie zu define(), wenn eine Konstante bedingt oder mit einem dynamischen Namen erstellt werden soll. Vertiefen Sie Ihr Wissen in den Kapiteln zu PHP-Konstanten und Klassenkonstanten.