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

时间:2014-11-11 10:50:41

标签: php

我需要检查一个类是否实现了特定的方法然后调用它。 如果方法存在且是静态的,则应该将其称为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的情况下测试方法是否定义为静态?

1 个答案:

答案 0 :(得分:1)

根据定义,类的静态函数是该类的方法,它也是可调用的,因此在其上调用method_existsis_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();