2012-02-10 20 views
6

Tengo una clase que configura un alias de clase para otros nombres de clases. Cuando se llama a una función dentro de esta clase a través de la clase con alias, necesito saber qué alias se utilizó. ¿Hay alguna manera de hacer esto en PHP?En PHP, ¿cómo se obtiene la clase llamada con alias cuando se usa class_alias?

que han intentado el siguiente código:

class foo 
{ 
    public static function test() 
    { 
    var_dump(get_called_class()); 
    } 
} 

class_alias('foo', 'bar'); 

foo::test(); 
bar::test(); 

que da salida:

string 'foo' (length=3) 
string 'foo' (length=3) 

Pero quiero bar::test(); a la salida string 'bar' (length=3) lugar. Agarrando en popotes, __CLASS__ y get_class() todos producen el mismo resultado. Parece que no puedo encontrar nada más en la documentación de PHP que me ayude con este problema, pero espero estar pasando por alto algo.

¿Cómo se obtiene la llamada aliased clase cuando se utiliza class_alias?

+5

Yo personalmente recomendaría simplemente no hacer alias en la clase. Solo va a terminar en lágrimas. – GordonM

+0

No puede hacerlo a menos que use el método horrendous debug_backtrace() ... bar :: test() no llama a prueba() en la clase de barra, que es un duplicado o clon de la clase foo; está llamando a prueba() en la clase foo, que también tiene un alias de barra, así que naturalmente get_called_class() devuelve "foo". –

+0

Dup http://stackoverflow.com/questions/6245705/get-top-level-class-name-when-inheritance-and-class-alias-is-used – CBusBus

Respuesta

7

No puede hacer esto fácilmente a partir de PHP 5.3-5.5.

Existen solo algunas formas de determinar cuál es la clase "actual" cuando se realiza una llamada. Todos ellos devuelven la clase no reservada.

class First { 
    public function test1() { echo get_called_class(); } 
    public function test2() { print_r(debug_backtrace()); } 
    public function test3() { echo get_class($this); } 
    public function test4() { echo __CLASS__; } 
    public static function test5() { echo get_called_class(); } 
} 
class_alias('First', 'Second'); 
$aliased = new Second(); 
$aliased->test1(); // First 
$aliased->test2(); // array(0 => array(... [object] => First Object, ...)) 
$aliased->test3(); // First 
$aliased->test4(); // First 
Second::test5(); // First 

3v4l demo.

Esto se debe a class_alias no crea una nueva clase con el nuevo nombre, se crea otra entrada en la lista de clases que apunta en la misma clase que el original. Cuando le pides a PHP que busque qué clase se está utilizando, encuentra la clase original, no el alias.

Si necesita crear una nueva clase no es más que la clase original con un nombre diferente, tendrá que hacerlo a través de la herencia. Puede hacerlo de manera dinámica usando eval. No puedo creer que vaya a recomendar eval por algo. Eww.

class First { 
    public function test1() { echo get_called_class(); } 
    public function test2() { print_r(debug_backtrace()); } 
    public function test3() { echo get_class($this); } 
    public function test4() { echo __CLASS__; } 
    public static function test5() { echo get_called_class(); } 
} 

function class_alias_kinda($original, $alias) { 
    eval("class $alias extends $original {}"); 
} 

class_alias_kinda('First', 'Second'); 
$aliased = new Second(); 
$aliased->test1(); // Second 
$aliased->test2(); // array(0 => array(... [object] => Second Object, ...)) 
$aliased->test3(); // Second 
$aliased->test4(); // First (this is expected) 
Second::test5(); // Second 

3v4l demo.

Esto podría no funcionar bien en todos los casos. En PHP, los miembros privados pueden ser no ser vistos por clases descendientes, por lo que esto podría romper su código horriblemente.

Cuestiones relacionadas