有没有办法找出方法是否是静态的?

时间:2013-04-17 01:53:18

标签: php static-methods

有没有办法找出方法是否是静态的?

我需要知道的理由: 我在任何实例化上下文之外调用静态方法。那时不能调用非静态方法,因为它们还没有意义。一旦这些类的实例存在,我想稍后再调用它们。

当我调用call_user_function_array($className.'::'.$functionName, $args);并且该方法是非静态的时,php似乎会自动创建一个className实例并调用该函数。我希望调用FAIL来获取非静态函数。

3 个答案:

答案 0 :(得分:2)

  

当我致电call_user_function_array($className.'::'.$functionName, $args);时   并且该方法是非静态的,php似乎是自动的   创建一个className实例并调用该函数。

不,它没有。 PHP不是 自动化。不知道你在那里做什么。

要静态调用方法,您可以这样做:

call_user_func_array("$className::$functionName", $args);

要调用对象的方法,首先需要显式实例化一个对象,然后像这样调用它:

$obj = new MyClass;
call_user_func_array(array($obj, $method), $args);

要以编程方式确定方法是否为静态,请使用ReflectionClass

$r = new ReflectionClass($myClass);
$m = $r->getMethod($method);
var_dump($m->isStatic());

在你调用它之前,你应该知道方法是什么,而不是动态地试图解决它。

答案 1 :(得分:1)

您可以使用反射检查方法。

class foo
    {
    static public function bar()
        {}

    public function baz()
        {}
    }

$reflection_class = new ReflectionClass('foo');

var_dump($reflection_class->getMethod('bar')->isStatic()); // boolean true
var_dump($reflection_class->getMethod('baz')->isStatic()); // boolean false

P.S。你试图调用方法但你不知道它们究竟是什么,这很奇怪。

答案 2 :(得分:0)

由于反射很昂贵,我实际上最终使用一个回调来调用set_error_handler,该回调会抛出一个ErrorException,如前所述here,以便在对非静态方法进行静态调用时捕获警告。