PHP:检查类是否实现了静态方法
我需要检查一个类是否实现了特定的方法,然后调用它。 如果某个方法存在并且是静态的,则应将其称为静态的,否则应在类实例(对象)上调用该方法。 当确定一个方法是否在类中定义为静态方法时,就会出现问题 下面是测试特定实例或类是否存在方法的示例代码PHP:检查类是否实现了静态方法,php,Php,我需要检查一个类是否实现了特定的方法,然后调用它。 如果某个方法存在并且是静态的,则应将其称为静态的,否则应在类实例(对象)上调用该方法。 当确定一个方法是否在类中定义为静态方法时,就会出现问题 下面是测试特定实例或类是否存在方法的示例代码 class A { public function b() {} public static function c() {} } $instance = new A(); var_dump(method_exists('A', 'b')
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
对于您的用例,您实际上不需要知道方法是否是静态的,调用
call_user_func([$instance,'c'])代码>
如果'c'
是静态方法和$instance
是对象或类名,它将被称为“静态”
同样,如果你打电话
call_user_func([$instance,'b'])代码>
如果'b'
是一个非静态方法和$instance
是一个对象,该方法将被“非静态”调用
如果你真的需要知道这个方法是静态的还是非静态的,那么你应该使用反射,它在性能方面做得很好,与你的信念相反
$rm = new \ReflectionMethod($instance_or_class, 'b');
$rm->isStatic();
你可以使用反射,我也可以使用反射,但我想弄清楚为什么is_是可调用的,而方法_的存在并不像PHP文档中所说的那样有效。另外,使用反射可能会引发性能问题。@Tez PHP从第一天起就没有静态方法。你甚至可以,所以这些方法当然会返回true,因为从技术上讲这是可能的使用反射方法有什么问题?@kingkero是的,但它不符合PHP严格的标准,所以我想这种方法在这种情况下不起作用。谢谢!使用ReflectionMethod检查isStatic()
中的runkit\u方法\u add()
到一个旧的/设计糟糕的代码库中的存根方法,迫切需要覆盖;运行良好,有助于保持简单(不必为每个测试指定方法是否为静态)。