【问题标题】:PHP: check if class implements static methodPHP:检查类是否实现静态方法
【发布时间】: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


【解决方案1】:

根据定义,类的静态函数是该类的方法,它也是可调用,因此在静态方法上调用method_existsis_callable 将总是返回真

对于您的用例,您实际上不需要知道方法是否是静态的,调用

call_user_func([$instance, 'c']);

如果'c' 是一个静态方法 并且$instance 是一个对象 或一个类名,就会做你想做的事,它将被称为“静态”

同样,如果你打电话

call_user_func([$instance, 'b']);

如果'b'非静态方法,而$instance对象,则该方法将在对象上“非静态地”调用

如果你真的需要知道该方法是否是静态的,那么你应该使用Reflection,它在性能方面做得很好,而不是你的信念

$rm = new \ReflectionMethod($instance_or_class, 'b');
$rm->isStatic();

【讨论】:

  • 谢谢!使用 ReflectionMethod 检查 isStatic() 是否有 runkit_method_add() 存根方法在一个旧的/设计不良的代码库中,迫切需要覆盖;运行良好并有助于保持简单(不必为每个测试指定方法是否是静态的)。
猜你喜欢
  • 1970-01-01
  • 2011-11-22
  • 2012-12-20
  • 2012-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多