Tengo una superclase PHP abstracta, que contiene un código que necesita saber en qué subclase se está ejecutando.PHP get_called_class() alternative
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'
Esto funcionaría si llamara a la función get_called_class()
- sin embargo, este código se va a ejecutar en PHP versión 5.2 *, por lo que la función no está disponible..
Hay algunas implementaciones PHP personalizado de get_called_class()
por ahí, pero todos se basan en ir a través de la debug_backtrack()
, analizar un nombre de archivo & número de línea, y ejecuta una expresión regular (como el codificador no es consciente de que PHP 5.2 tiene reflexión) a encuentra el nombre de la clase. Este código debe poder ejecutarse con php, es decir. no solo desde un archivo .php (Necesita funcionar desde un shell php -a
, o una instrucción eval()
.)
Idealmente, una solución funcionaría sin necesidad de agregar ningún código a las subclases ... La única solución potencial que puedo ver es agregar el siguiente código a cada subclase, lo que obviamente es un corte desagradable:
class FooBar extends Foo {
static function _get_class_name() {
return 'FooBar';
}
}
EDIT: Espera, esto ni siquiera parece funcionar. Hubiera sido mi último recurso. ¿Alguien puede pensar en algo similar a esta solución que me daría la funcionalidad requerida? Es decir, estoy dispuesto a aceptar una solución que requiera que agregue una función o variable a cada subclase diciéndole cuál es su nombre de clase. Desafortunadamente, parece que llamar a self::_get_class_name()
desde la superclase llama a la implementación de la clase padre, incluso si la subclase lo ha anulado.
La mejor solución, la verdad, es la actualización a 5.3. – Charles
Lo sé, pero desafortunadamente, esa no es una opción. –
y ¿cómo hacemos esto en Java? –