2011-11-28 4 views
5

voglio chiamare un metodo di classe da una var (come questo):PHP ottenere metodi statici

$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(); 

ho letto nella php-manual come ottenere la funzione-membri di una classe (get_class_methods). ma ottengo sempre ogni membro senza informazioni se è statico o no.

come posso determinare il contesto di un metodo?

grazie per il vostro aiuto

+1

Si noti inoltre che la chiamata di un metodo statico da una variabile di istanza è supportata in PHP. – JRL

risposta

13

Utilizzare la classe 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)); 

Questa uscita tutte le funzioni statiche.

Oppure, se si vuole determinare se una data funzione è statico è possibile utilizzare la classe ReflectionMethod:

Su 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

Questo è fondamentalmente quello che stavo per dire, è possibile utilizzare hasMethod di $ func1 per determinare se lanciare o meno l'eccezione –

+0

esattamente ciò di cui ho bisogno, grazie – 0xDEADBEEF

4

Un modo che conosco è quello di utilizzare Reflection. In particolare, si potrebbe usare ReflectionClass::getMethods come tale:

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

La difficoltà di questo è che è necessario avere abilitato riflessione, che non è di default.