Signatur
Beschreibung
get_called_class() ist das funktionale Äquivalent zu static::class und gibt den Namen der Klasse zurück, auf der eine statische Methode tatsächlich aufgerufen wurde – nicht zwangsläufig die Klasse, in der die Methode definiert ist. Dieses Konzept nennt sich Late Static Binding (LSB) und wurde mit PHP 5.3 eingeführt.
Im Gegensatz zu get_class() oder __CLASS__, die stets die definierende Klasse liefern, spiegelt get_called_class() die konkrete, zur Laufzeit verwendete Klasse wider. Das ist besonders nützlich, wenn eine Basisklasse statische Methoden bereitstellt, die in abgeleiteten Klassen wiederverwendet werden sollen, ohne sie dort überschreiben zu müssen – etwa bei Factory-Methoden oder Active-Record-Mustern.
Ab PHP 5.5 kann alternativ static::class als Klassen-Konstante verwendet werden, die identisches Verhalten zeigt und als moderner und lesbarer gilt. get_called_class() bleibt aber weiterhin verfügbar und wird nicht als veraltet markiert.
Außerhalb eines Klassenkontexts gibt die Funktion false zurück und erzeugt eine Warnung.
Rückgabewert
string zurück. Wird die Funktion außerhalb eines Klassenkontexts aufgerufen, wird false zurückgegeben.Beispiele
Basisklasse ermittelt den konkreten Klassennamen per LSB
<?php
class ParentModel
{
public static function create(): static
{
$calledClass = get_called_class();
echo "Instanz von: " . $calledClass . PHP_EOL;
return new static();
}
}
class UserModel extends ParentModel {}
class ProductModel extends ParentModel {}
ParentModel::create();
UserModel::create();
ProductModel::create();
Factory-Muster mit get_called_class()
<?php
class Registry
{
private static array $instances = [];
public static function getInstance(): static
{
$class = get_called_class();
if (!isset(self::$instances[$class])) {
self::$instances[$class] = new static();
echo "Neue Instanz erstellt für: " . $class . PHP_EOL;
} else {
echo "Vorhandene Instanz zurückgegeben für: " . $class . PHP_EOL;
}
return self::$instances[$class];
}
}
class CacheRegistry extends Registry {}
class SessionRegistry extends Registry {}
CacheRegistry::getInstance();
CacheRegistry::getInstance();
SessionRegistry::getInstance();
Vergleich mit __CLASS__ und static::class
<?php
class Base
{
public static function info(): void
{
echo '__CLASS__: ' . __CLASS__ . PHP_EOL;
echo 'get_called_class(): ' . get_called_class() . PHP_EOL;
echo 'static::class: ' . static::class . PHP_EOL;
}
}
class Child extends Base {}
Child::info();
// Wichtig · Fallstricke
Modern bevorzugt: Ab PHP 5.5 sollte static::class gegenüber get_called_class() bevorzugt werden, da es kürzer, lesbarer und konsistenter mit anderen Klassen-Konstanten wie self::class und parent::class ist.
Außerhalb von Klassen: Der Aufruf außerhalb eines Klassen- oder Objektkontexts liefert false und erzeugt eine PHP-Warnung. Daher sollte die Funktion ausschließlich innerhalb von Klassen verwendet werden.
Kein Objekt-Kontext nötig: Die Funktion funktioniert rein statisch und benötigt keine Objekt-Instanz, was sie von get_class($this) unterscheidet.