1

我有一个类,我想在调用 method_exists() 等时返回 true,以便我可以通过 __call() 处理它。

我偶然发现了这个关于删除行为和 __call() https://bugs.php.net/bug.php?id=32429的链接

希望这是有道理的。谢谢。

这是我不够清楚的评论。

class MyClass {
  public function __call($method, $args) {
    if($method === 'something') {
      // do something
    }
  }
}

然后在别的地方

$my_class = new MyClass();
if(method_exists($my_class, 'something')) {
  // do something
  // But does not because method exists returns false
  // I would like it to return true if possible
}

有什么我不明白的复杂之处吗?

4

1 回答 1

3

method_exists不会检测到__call,因为您传递给它的未定义方法实际上并不存在。如果确实如此,它将被视为错误,如您的问题中所链接。

做到这一点的唯一方法(没有像runkit这样的 PECL 扩展或修改 PHP 源代码)是使用一些命名空间黑魔法来覆盖以下行为method_exists

namespace Foo;

function method_exists($object, $method) {
    return \method_exists($object, '__call') ?: 
           \method_exists($object, $method);
}

class Bar {
    public function __call($n, $a) { }
}
class Baz { }

var_dump(method_exists('Foo\Baz', 'hello')); // false
var_dump(method_exists('Foo\Bar', 'hello')); // true

我不会推荐它,但是,嘿,你要求它。

于 2012-05-02T16:22:07.997 回答