2011-11-28 63 views
5

我想通过VAR(像这样)调用类方法:PHP获得静态方法

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

我在阅读的PHP手册如何获取类(get_class_methods)的函数成员。但如果它的静态或不静态,我总是得到每一个没有信息的成员。

我如何确定方法的上下文?

感谢你的帮助

+1

另请注意,PHP中支持从实例变量调用静态方法。 – JRL

回答

13

使用类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)); 

这将输出所有静态功能。

或者,如果你想确定给定函数是否是静态的,你可以使用ReflectionMethod类:

在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

这基本上是我要说的,你可以使用$ func1的hasMethod来确定是否抛出异常 –

+0

正是我所需要的,谢谢 – 0xDEADBEEF

4

一种方法是使用Reflection。特别是,一个会用ReflectionClass::getMethods这样:

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

这样做的困难在于你必须激活反思,它是不是默认。