【发布时间】:2014-11-11 10:50:41
【问题描述】:
我需要检查一个类是否实现了特定的方法,然后调用它。 如果方法存在并且是静态的,则应将其称为静态,否则应在类实例(对象)上调用它。 当确定某个方法是否在类中定义为静态方法时会出现问题。
这是一个测试特定实例或类是否存在方法的示例代码。
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)
问题是为什么即使为静态或非静态调用传递了可调用参数,结果总是为真?
如何在不使用反射的情况下测试方法是否定义为静态?
【问题讨论】:
-
你可能会为此使用反射
-
我可以使用反射,但我试图弄清楚为什么 is_callable 和 method_exists 不能按照 PHP 文档中的说明工作。此外,使用反射可能会引发性能问题。
-
@Tez PHP 从第一天起就没有静态方法。你甚至可以call non-static methods from a static context (and vice versa),所以这些方法当然会返回 true,因为从技术上讲是可能的
-
使用反射方法有什么问题?
-
@kingkero 是的,但它不符合 PHP 严格的标准,所以我猜这种方法在这种情况下行不通。
标签: php