W3docs

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_FEE einmal; jeder Aufrufer liest dieselbe Zahl.
  • Lesbarkeit. Circle::PI sagt weit mehr als ein bloßes 3.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"; // cm

Was 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.
php— editable, runs on the server
constant value
constant value

Die 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 / x9f2

Hier 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::NAME wird beim Schreiben des Codes aufgelöst – es bedeutet immer die Konstante in der Klasse, in der die Methode definiert ist.
  • static::NAME wird 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"; // active

Interfaces 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;$RATE zu 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.
  • self vs static. Verwenden Sie static::, wenn eine Unterklasse den Wert überschreiben können soll; ansonsten ist self:: 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.

Übungen

Übung
Was ist laut dem Link https://www.w3docs.com/learn-php/php-class-constants.html wahr über PHP-Klassenkonstanten?
Was ist laut dem Link https://www.w3docs.com/learn-php/php-class-constants.html wahr über PHP-Klassenkonstanten?
Was this page helpful?