PHP get_called_class () alternative

Ich habe eine abstrakte PHP-Superklasse, die Code enthält, der wissen muss, unter welcher Unterklasse er läuft.

class Foo {
    static function _get_class_name() {
        return get_called_class();
        //works in PHP 5.3.*, but not in PHP 5.2.*
    }

    static function other_code() {
        //needs to know
        echo self::_get_class_name();
    }
}

class Bar extends Foo {
}

class FooBar extends Foo {
}

Bar::other_code(); // i need 'Bar'
FooBar::other_code(); // i need 'FooBar'

Dies würde funktionieren, wenn ich die Funktion @ aufrufen würget_called_class() - Dieser Code wird jedoch in PHP Version 5.2. * ausgeführt, sodass diese Funktion nicht verfügbar ist.

Es gibt einige benutzerdefinierte PHP-Implementierungen vonget_called_class() da draußen, aber sie alle verlassen sich auf die @ gehdebug_backtrack(), Analysieren eines Dateinamens und einer Zeilennummer und Ausführen eines regulären Ausdrucks (da der Codierer nicht weiß, dass PHP 5.2 über eine Reflektion verfügt), um den Klassennamen zu finden. Dieser Code muss mit PHP ausgeführt werden können, dh. nicht nur aus einer .php Datei. (Es muss von einem @ arbeitphp -a Shell oder eineval() Erklärung.

Idealerweise würde eine Lösung funktionieren, ohne dass Code zu den Unterklassen hinzugefügt werden muss ... Die einzige mögliche Lösung, die ich sehen kann, ist das Hinzufügen des folgenden Codes zu jeder Unterklasse, was offensichtlich ein ekelhafter Hack ist:

class FooBar extends Foo {
    static function _get_class_name() {
        return 'FooBar';
    }
}

EDIT: Warten Sie, das scheint nicht einmal zu funktionieren. Es wäre mein letzter Ausweg gewesen. Kann sich jemand etwas Ähnliches vorstellen, das mir die erforderliche Funktionalität verschafft? Das heißt, ich bin bereit, eine Lösung zu akzeptieren, bei der ich @ hinzufügen museine Funktion oder Variable für jede Unterklasse, die den Klassennamen angibt. Leider scheint es, dass das Aufrufen vonself::_get_class_name() aus der Oberklasse ruft die Implementierung der übergeordneten Klasse auf, auch wenn die Unterklasse sie überschrieben hat.

Antworten auf die Frage(18)

Ihre Antwort auf die Frage