Start · Sprachen · PHP · Referenz · get_called_class

get_called_class

Funktion

Gibt den Namen der Klasse zurück, auf der eine statische Methode per Late Static Binding aufgerufen wurde.

seit PHP 5.3.0 Kategorie: oop

Signatur

get_called_class(): string|false

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

Typ
string|false
Beschreibung
Gibt den Namen der aufgerufenen Klasse als 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();
Instanz von: ParentModel Instanz von: UserModel Instanz von: ProductModel

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();
Neue Instanz erstellt für: CacheRegistry Vorhandene Instanz zurückgegeben für: CacheRegistry Neue Instanz erstellt für: SessionRegistry

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();
__CLASS__: Base get_called_class(): Child static::class: Child

// 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.