gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 21:08:45 25 4
gpt4 key购买 nike

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

这是测试特定实例或类是否存在方法的示例代码。

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)

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

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

最佳答案

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

关于PHP:检查类是否实现了静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26863103/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com