Klassenkonstanten
Es ist möglich, Konstanten für
jede Klasse zu definieren, die gleich und unveränderlich bleiben. Die
standardmäßige Sichtbarkeit einer Klassenkonstante ist
public
.
Hinweis:
Klassenkonstanten können von einer Kindklasse neu definiert werden.
Ab PHP 8.1.0 können Klassenkonstanten nicht mehr von einer Kindklasse neu
definiert werden, wenn sie als
final definiert ist.
Ein Interface kann ebenfalls Konstanten
enthalten. Die
Interface-Dokumentation
enthält Beispiele dazu.
Es ist möglich, eine Variable als Klassenreferenz zu nutzen. Der
Variablenwert darf kein Schlüsselwort (wie self
,
parent
oder static
) sein.
Es ist zu beachten, dass Klassenkonstanten nur einmal pro Klasse angelegt
werden und nicht für jedes Klassenexemplar.
Beispiel #1 Eine Konstante definieren und benutzen
<?php
class MyClass
{
const CONSTANT = 'Konstanter Wert';
function showConstant() {
echo self::CONSTANT . "\n";
}
}
echo MyClass::CONSTANT . "\n";
$classname = "MyClass";
echo $classname::CONSTANT . "\n";
$class = new MyClass();
$class->showConstant();
echo $class::CONSTANT."\n";
?>
Die spezielle Konstante ::class
erlaubt die Auflösung
voll qualifizierter Klassennamen zur Kompilierzeit, was nützlich für Klassen
in Namensräumen ist:
Beispiel #2 Beispiel für ::class in einem Namensraum
<?php
namespace foo {
class bar {
}
echo bar::class; // foo\bar
}
?>
Beispiel #3 Beispiel für Ausdrücke mit Klassenkonstanten
<?php
const ONE = 1;
class foo {
const TWO = ONE * 2;
const THREE = ONE + self::TWO;
const SENTENCE = 'Der Wert von THREE ist '.self::THREE;
}
?>
Beispiel #4 Sichtbarkeitsmodifizierer von Klassenkonstanten seit PHP 7.1.0
<?php
class Foo {
public const BAR = 'bar';
private const BAZ = 'baz';
}
echo Foo::BAR, PHP_EOL;
echo Foo::BAZ, PHP_EOL;
?>
Das oben gezeigte Beispiel erzeugt mit PHP 7.1 folgende Ausgabe:
bar
Fatal error: Uncaught Error: Cannot access private const Foo::BAZ in …
Hinweis:
Von PHP 7.1.0 an sind Sichtbarkeitsmodifizierer für Klassenkonstanten
erlaubt.
Beispiel #5 Überprüfen der Sichtbarkeitsvarianz von Klassenkonstanten seit PHP 8.3.0
<?php
interface MyInterface
{
public const VALUE = 42;
}
class MyClass implements MyInterface
{
protected const VALUE = 42;
}
?>
Das oben gezeigte Beispiel erzeugt mit PHP 8.3 folgende Ausgabe:
Fatal error: Access level to MyClass::VALUE must be public (as in interface MyInterface) …
Hinweis:
Seit PHP 8.3.0 wird die Varianz der Sichtbarkeit strenger geprüft.
Vor dieser Version konnte sich die Sichtbarkeit einer Klassenkonstante von
der Sichtbarkeit der Konstante in der implementierten Schnittstelle
unterscheiden.
Beispiel #6 Syntax für das Abrufen von Klassenkonstanten seit PHP 8.3.0
<?php
class Foo {
public const BAR = 'bar';
private const BAZ = 'baz';
}
$name = 'BAR';
echo Foo::{$name}, PHP_EOL; // bar
?>
Hinweis:
Seit PHP 8.3.0 können Klassenkonstanten dynamisch über eine Variable
abgerufen werden.