2011-11-28 16 views
5

Quiero llamar a un método de clase por un var (como este):PHP llegar métodos estáticos

$var = "read"; 
$params = array(...); //some parameter 
if(/* MyClass has the static method $var */) 
{ 
    echo MyClass::$var($params); 
} 
elseif (/* MyClass hat a non-static method $var */) 
{ 
    $cl = new MyClass($params); 
    echo $cl->$var(); 
} 
else throw new Exception(); 

leí en el php-manual de cómo conseguir la función de los miembros de una clase (get_class_methods). pero siempre recibo a cada miembro sin información si está estático o no.

¿cómo puedo determinar el contexto de un método?

gracias por su ayuda

+1

Tenga en cuenta también que PHP admite el llamado a un método estático a partir de una variable de instancia. – JRL

Respuesta

13

Utilice la clase ReflectionClass:

On Codepad.org: http://codepad.org/VEi5erFw 
<?php 

class MyClass 
{ 
    public function func1(){} 
    public static function func2(){} 
} 

$reflection = new ReflectionClass('MyClass'); 
var_dump($reflection->getMethods(ReflectionMethod::IS_STATIC)); 

Esta salida todas las funciones estáticas.

O si lo desea determinar si una función dada es estática puede utilizar la clase ReflectionMethod:

En Codepad.org: http://codepad.org/2YXE7NJb

<?php 

class MyClass 
{ 
    public function func1(){} 
    public static function func2(){} 
} 

$reflection = new ReflectionClass('MyClass'); 

$func1 = $reflection->getMethod('func1'); 
$func2 = $reflection->getMethod('func2'); 

var_dump($func1->isStatic()); 
var_dump($func2->isStatic()); 
+0

Esto es básicamente lo que iba a decir también, puede usar hasMethod of $ func1 para determinar si se debe o no arrojar y la excepción –

+0

exactamente lo que necesito, gracias – 0xDEADBEEF

4

Una forma que conozco es utilizar Reflection. En particular, se podría usar como tal ReflectionClass::getMethods:

$class = new ReflectionClass("MyClass"); 
$staticmethods = $class->getMethods(ReflectionMethod::IS_STATIC); 
print_r($staticmethods); 

La dificultad de esto es que es necesario tener habilitada la reflexión, que no es por defecto.