PHP OOP-Klassenkonstanten verstehen
PHP-Klassenkonstanten mit const deklarieren, Sichtbarkeit steuern, Arrays und Ausdrücke als Werte nutzen und via self, static oder Klassenname abrufen.
Eine Klassenkonstante ist ein fester, benannter Wert, der zu einer Klasse und nicht zu einem einzelnen Objekt gehört. Sie wird einmal definiert, kann zur Laufzeit nie neu zugewiesen werden und wird von jeder Instanz der Klasse gemeinsam genutzt. Konstanten ermöglichen es, den „magischen" Werten, auf die Ihr Code angewiesen ist – einem Steuersatz, einem Status-String, einer API-Version –, aussagekräftige Namen zu geben, sodass sie an einem Ort zusammengefasst sind, anstatt als Literale über den Code verstreut zu sein.
Dieses Kapitel behandelt, wie Klassenkonstanten mit const deklariert werden, wie sie mit self, static und dem Klassennamen gelesen werden, wie ihre Sichtbarkeit gesteuert wird und wie sie sich bei Vererbung und Interfaces verhalten. Alle folgenden Beispiele laufen unter PHP 8.
Warum Klassenkonstanten verwenden?
Greifen Sie auf eine Klassenkonstante zurück, wenn ein Wert im Voraus bekannt ist und sich während der Ausführung des Skripts nie ändern darf:
- Einzige Quelle der Wahrheit. Definieren Sie einen Wert wie
Order::SHIPPING_FEEeinmal; jeder Aufrufer liest dieselbe Zahl. - Lesbarkeit.
Circle::PIsagt weit mehr als ein bloßes3.14159, das in einer Berechnung vergraben ist. - Sicherheit. PHP lehnt jeden Versuch ab, eine Konstante neu zuzuweisen, sodass ein Tippfehler sie nicht stillschweigend überschreiben kann.
- Kein Objekt erforderlich. Da eine Konstante zur Klasse gehört, können Sie sie lesen, ohne eine Instanz zu erstellen.
Klassenkonstanten unterscheiden sich von regulären Variablen in zwei wichtigen Punkten: Sie werden ohne Dollarzeichen geschrieben (MAX_USERS, nicht $MAX_USERS), und sie sind unveränderlich, sobald sie definiert wurden.
Eine Klassenkonstante definieren
Deklarieren Sie eine Konstante im Klassenkörper mit dem Schlüsselwort const, einem Namen (konventionell UPPER_SNAKE_CASE) und einem Wert:
<?php
class MyClass {
const CONSTANT = 'constant value';
public function showConstant() {
echo self::CONSTANT . "\n";
}
}Dies definiert CONSTANT in MyClass. Eine Klassenkonstante ist nicht dasselbe wie eine globale Konstante, die mit define() erstellt wird: const gehört zur Klasse und wird über :: erreicht, während define() einen Namen im globalen Gültigkeitsbereich registriert.
Der Wert kann ein konstanter Ausdruck sein – eine Berechnung, die PHP zur Kompilierzeit auflösen kann – und sogar ein Array:
<?php
class Circle {
const PI = 3.14159;
const TWO_PI = self::PI * 2; // built from another constant
const UNITS = ['mm', 'cm', 'm'];
}
echo Circle::TWO_PI . "\n"; // 6.28318
echo Circle::UNITS[1] . "\n"; // cmWas Sie nicht verwenden dürfen, ist alles, was nur zur Laufzeit bekannt ist – Funktionsaufrufe, Objektinstanzen oder $Variablen sind im Wert einer Konstante nicht erlaubt.
Auf eine Klassenkonstante zugreifen
Wie Sie eine Konstante lesen, hängt davon ab, wo Sie sich befinden:
- Von außerhalb der Klasse verwenden Sie den Klassennamen:
MyClass::CONSTANT. - Von innerhalb der Klasse verwenden Sie das Schlüsselwort
self:self::CONSTANT.
constant value
constant valueDie erste Zeile liest die Konstante statisch über den Klassennamen – kein Objekt erforderlich. Die zweite geht über eine Instanzmethode, die self::CONSTANT verwendet. Beachten Sie, dass auf Konstanten mit :: zugegriffen wird, niemals mit dem -> Objekt-Operator, den Sie für Eigenschaften verwenden.
Sichtbarkeit steuern
Seit PHP 7.1 akzeptieren Klassenkonstanten dieselben Sichtbarkeitsmodifikatoren wie Eigenschaften und Methoden: public (Standard), protected und private. So können Sie Implementierungsdetails verbergen, die zur Klasse gehören, aber nicht von außen gelesen werden sollen.
<?php
class Config {
public const VERSION = '2.0';
protected const API_KEY = 'secret-123';
private const SALT = 'x9f2';
public function describe(): string {
return self::VERSION . ' / ' . self::API_KEY . ' / ' . self::SALT;
}
}
echo Config::VERSION . "\n"; // 2.0 — public, readable anywhere
$c = new Config();
echo $c->describe() . "\n"; // 2.0 / secret-123 / x9f2Hier ist Config::VERSION überall zugänglich, während API_KEY und SALT nur von innerhalb der Klasse erreicht werden können (oder für protected von deren Unterklassen). Der Versuch, Config::SALT von außen zu lesen, löst einen Fehler aus.
Konstanten und Vererbung
Unterklassen erben die Konstanten ihrer Elternklasse und können diese überschreiben. Das Schlüsselwort, das Sie zum Lesen der Konstante verwenden, entscheidet, welche Version Sie erhalten:
self::NAMEwird beim Schreiben des Codes aufgelöst – es bedeutet immer die Konstante in der Klasse, in der die Methode definiert ist.static::NAMEwird zur Laufzeit gegen die tatsächlich aufgerufene Klasse aufgelöst. Dies wird als Late Static Binding bezeichnet.
<?php
interface HasStatus {
const ACTIVE = 'active'; // interface constants are always public
}
class Order implements HasStatus {
const SHIPPING_FEE = 5.00;
public function status(): string {
return self::ACTIVE;
}
}
class ExpressOrder extends Order {
const SHIPPING_FEE = 15.00;
public function fee(): float {
return static::SHIPPING_FEE; // uses the called class's value
}
}
echo Order::ACTIVE . "\n"; // active (inherited from the interface)
echo (new ExpressOrder())->fee() . "\n"; // 15
echo (new ExpressOrder())->status() . "\n"; // activeInterfaces können ebenfalls Konstanten deklarieren; sie sind implizit public und werden von jeder implementierenden Klasse geteilt. Wenn Sie eine Konstante benötigen, die Unterklassen nicht überschreiben dürfen, markieren Sie sie mit final (PHP 8.1+): final const ID = 100;. PHP 8.3 hat auch typisierte Konstanten hinzugefügt, z. B. const string LABEL = 'base';.
Weitere Informationen zum Verhalten von Unterklassen finden Sie unter PHP Inheritance und für das verwandte Feature der klassenweiten Datenspeicherung unter PHP Static Properties.
Häufige Fallstricke
- Kein Dollarzeichen.
const RATE = 0.2;—$RATEzu schreiben ist ein Syntaxfehler. ::, nicht->. Auf Konstanten wird immer mit dem Scope-Resolution-Operator zugegriffen.- Laufzeitwerte werden abgelehnt. Der Wert einer Konstante muss ein konstanter Ausdruck sein;
const NOW = time();lässt sich nicht kompilieren. selfvsstatic. Verwenden Siestatic::, wenn eine Unterklasse den Wert überschreiben können soll; ansonsten istself::die sicherere und vorhersehbarere Wahl.
Fazit
Klassenkonstanten geben Ihnen benannte, unveränderliche, klassenbezogene Werte, die mit const definiert und über :: gelesen werden. Verwenden Sie sie, um feste Werte zu zentralisieren, die Lesbarkeit zu verbessern und Daten zu sperren, die sich zur Laufzeit nie ändern sollten. Kombinieren Sie sie mit Sichtbarkeitsmodifikatoren, um Interna zu verbergen, und denken Sie an den Unterschied zwischen self und static, sobald Vererbung ins Spiel kommt.