2009-07-20 17 views
29

Quiero comprobar que existe una función en una biblioteca que estoy creando, que es estática. He visto function y method_exists, pero no he encontrado una forma que me permita llamarlos en un contexto relativo. Aquí está un ejemplo mejor:Averiguar si existe un método en una clase estática

class myClass{ 
    function test1() 
    { 
     if(method_exists("myClass", "test1")) 
     { 
      echo "Hi"; 
     } 
    } 
    function test2() 
    { 
     if(method_exists($this, "test2")) 
     { 
      echo "Hi"; 
     } 
    } 
    function test3() 
    { 
     if(method_exists(self, "test3")) 
     { 
      echo "Hi"; 
     } 
    } 
} 
// Echos Hi 
myClass::test1(); 
// Trys to use 'self' as a string instead of a constant 
myClass::test3(); 
// Echos Hi 
$obj = new myClass; 
$obj->test2(); 

tengo que ser capaz de hacer la prueba de eco 3 Hola, si la función existe, sin necesidad de sacarlo de contexto estático. Dada la palabra clave para acceder a la clase debe ser 'self', ya que $ es para clases asignadas.

+0

¿Por qué no es suficiente el método test1()? – gapple

+0

Porque quiero poner esto en una clase que se extenderá por varias clases. Podría usar una constante mágica para lograr esto, pero debería haber una manera más fácil. –

Respuesta

49

get_called_class() se introdujo en PHP 5.3, y volveremos "enlace en tiempo estático" el nombre de clase:

class myClass{ 
    public static function test() 
    { 
     if(method_exists(get_called_class(), "test")) 
     { 
       echo get_called_class().'::test()'; 
     } 
    } 
} 

class subClass extends myClass{} 

subClass::test() // should print "subClass::test()" 

La función get_class(), que a partir de PHP 5.0.0 no requiere cualquier parámetro si se llama dentro de una clase devolverá el nombre de la clase en la que se declaró la función (por ejemplo, la clase padre):

class myClass{ 
    public static function test() 
    { 
     if(method_exists(get_class(), "test")) 
     { 
       echo get_class().'::test()'; 
     } 
    } 
} 

class subClass extends myClass{} 

subClass::test() // prints "myClass::test()" 

El __CLASS__ magic constant hace lo mismo [link].

class myClass{ 
    public static function test() 
    { 
     if(method_exists(__CLASS__, "test")) 
     { 
       echo __CLASS__.'::test()'; 
     } 
    } 
} 

class subClass extends myClass{} 

subClass::test() // prints "myClass::test()" 
+0

¡Gracias! Eso era exactamente lo que estaba buscando. –

+0

Estaba buscando una manera de comprobar si existe un método estático en la clase padre, y esta respuesta me llevó a descubrir que 'get_parent_class()' funciona de la misma manera cuando se llama sin ningún parámetro. ¡Gracias! – mopo922

1

Actualización:

Ahh, disculpas. Estuve temporalmente ciego :) Querrá usar la constante mágica __CLASS__

p.

if (method_exists(__CLASS__, "test3")) { echo "Hi"; } 
+0

esta respuesta parece ser la misma que el método test1() del ejemplo de pregunta que usa method_exists() con el nombre de clase pasado como una cadena – gapple

+0

La idea es que no necesito un nombre de clase y, por lo tanto, puedo poner el método en cualquier clase, y debería funcionar, ya sea que la clase haya sido asignada o no. –

+0

¿Quiere decir a partir de los comentarios que 'acabo' de plantear la pregunta principal? –

Cuestiones relacionadas