我需要检查一个类是否实现了特定的方法然后调用它。 如果方法存在且是静态的,则应该将其称为static,否则应该在类实例(对象)上调用它。 在确定方法是否在类中定义为静态方法时会发生此问题。
这是一个示例代码,用于测试方法存在的特定实例或类。
class A {
public function b() {}
public static function c() {}
}
$instance = new A();
var_dump(method_exists('A', 'b'));
var_dump(method_exists($instance, 'b'));
var_dump(method_exists('A', 'c'));
var_dump(method_exists($instance, 'c'));
var_dump(is_callable(['A', 'b']));
var_dump(is_callable([$instance, 'b']));
var_dump(is_callable(['A', 'c']));
var_dump(is_callable([$instance, 'c']));
执行时输出如下:
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
问题是,即使为静态或非静态调用传递了callable参数,结果总是为真?
如何在不使用Reflection的情况下测试方法是否定义为静态?
答案 0 :(得分:1)
根据定义,类的静态函数是该类的方法,它也是可调用的,因此在其上调用method_exists
或is_callable
静态方法将始终 返回true
对于您的用例,您不需要实际知道该方法是否是静态的,就调用
call_user_func([$instance, 'c']);
如果'c'
是静态方法,并且$instance
是对象或类名< / strong>,正如您所说的,它将被称为“静态”
类似地,如果您要拨打电话
call_user_func([$instance, 'b']);
如果'c'
是非静态方法,而$instance
是对象,则将在对象“非静态”上调用该方法< / p>
如果您真的需要知道该方法是否是静态的(我个人看不到为什么需要用到它的用例)
然后您应该使用 Reflection ,它在表现方面表现出色,违背了您的信念
$rm = new \ReflectionMethod($instance, 'b');
$rm->isStatic();