Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:检查类是否实现了静态方法_Php - Fatal编程技术网

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()
到一个旧的/设计糟糕的代码库中的存根方法,迫切需要覆盖;运行良好,有助于保持简单(不必为每个测试指定方法是否为静态)。