PHP:检查类是否实现静态方法


PHP: check if class implements static method

我需要检查一个类是否实现了特定的方法,然后调用它。如果一个方法存在并且是静态的,那么它应该被称为静态的,否则它应该在类实例(对象)上调用。当确定一个方法是否在类中定义为静态方法时,就会出现此问题。

下面是一个示例代码,用于测试特定实例或类是否存在方法。

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)

问题是,即使为静态或非静态调用传递了可调用参数,为什么结果总是true?

如何在不使用反射的情况下测试方法是否定义为静态?

根据定义,类的静态函数是该类的方法,它也是可调用的,因此在静态方法上调用method_existsis_callable将始终返回true

对于您的用例,您不需要真正知道该方法是否是静态的,调用

call_user_func([$instance, 'c']);

如果'c'是一个静态方法,而$instance对象类名时,它将被称为"静态"

同样,如果你正在调用

call_user_func([$instance, 'b']);

如果'b'是一个非静态方法$instance是一个对象,则该方法将在对象"非静态"上调用

如果你真的需要知道这个方法是否是静态的,那么你应该使用Reflection,它在性能方面做得很好,违背你的信念

$rm = new 'ReflectionMethod($instance_or_class, 'b');
$rm->isStatic();