W3docs

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 constant
class 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:

Merkmalconstdefine()
AuswertungZur KompilierzeitZur Laufzeit
Bedingte Ausführung (innerhalb von if)NeinJa
Verwendung innerhalb einer KlasseJa (Klassenkonstante)Nein
Name aus einer Variable/einem AusdruckNeinJa (define($name, ...))
WertNur konstante AusdrückeJeder 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 John

Eine 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;       // editor

Funktionsaufrufe 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; // pending

Interfaces 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. const kann nicht in ein if, eine Schleife oder eine Funktion eingebettet werden, die auf Laufzeitdaten basiert — verwenden Sie dafür define().
  • Konstanten sind global sichtbar. Eine globale const-Konstante ist innerhalb von Funktionen sichtbar, ohne global verwenden zu müssen — anders als eine normale Variable.

Vorteile

  • Lesbarkeit: Eine benannte Konstante wie TAX_RATE dokumentiert 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.

Übungen

Übung
Welche der folgenden Aussagen über Konstanten in PHP sind wahr?
Welche der folgenden Aussagen über Konstanten in PHP sind wahr?
Was this page helpful?