有没有办法找出方法是否是静态的?
我需要知道的理由: 我在任何实例化上下文之外调用静态方法。那时不能调用非静态方法,因为它们还没有意义。一旦这些类的实例存在,我想稍后再调用它们。
当我调用call_user_function_array($className.'::'.$functionName, $args);
并且该方法是非静态的时,php似乎会自动创建一个className实例并调用该函数。我希望调用FAIL来获取非静态函数。
答案 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,以便在对非静态方法进行静态调用时捕获警告。