有没有办法找出方法是否是静态的?
我需要知道的原因:我在任何实例化上下文之外调用静态方法。那时不能调用非静态方法,因为它们还没有意义。一旦这些类的实例存在,我想稍后再调用它们。
当我调用call_user_function_array($className.'::'.$functionName, $args);
并且该方法是非静态的时,php 似乎会自动创建一个 className 实例并调用该函数。我希望对非静态函数调用 FAIL。
有没有办法找出方法是否是静态的?
我需要知道的原因:我在任何实例化上下文之外调用静态方法。那时不能调用非静态方法,因为它们还没有意义。一旦这些类的实例存在,我想稍后再调用它们。
当我调用call_user_function_array($className.'::'.$functionName, $args);
并且该方法是非静态的时,php 似乎会自动创建一个 className 实例并调用该函数。我希望对非静态函数调用 FAIL。
当我调用
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());
不过,在调用它之前,您应该真正知道什么是方法,而不是动态地试图弄清楚它。
您可以使用反射检查方法。
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 你试图调用方法但你不知道它们到底是什么,这很奇怪。
由于反射很昂贵,我实际上最终调用set_error_handler
了一个抛出 ErrorException 的回调,如此处所述,以在对非静态方法进行静态调用时捕获警告。