0

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

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

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

4

3 回答 3

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

不过,在调用它之前,您应该真正知道什么是方法,而不是动态地试图弄清楚它。

于 2013-04-17T01:58:34.110 回答
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

PS 你试图调用方法但你不知道它们到底是什么,这很奇怪。

于 2013-04-17T01:59:38.443 回答
0

由于反射很昂贵,我实际上最终调用set_error_handler了一个抛出 ErrorException 的回调,如此处所述以在对非静态方法进行静态调用时捕获警告。

于 2013-04-17T03:12:07.970 回答