为什么 PHP 的 method_exists() CALL (!) 是一个方法,而根据定义它应该只返回一个布尔值


Why does PHP's method_exists() CALL (!) a method when it should just return a boolean by definition?

>问题

PHP 的 method_exists() [doc page] 检查方法是否存在并返回一个布尔值。但是:在特殊情况下(当类和方法具有相同的名称时),此函数实际上调用了一个方法。我对此感到非常困惑,并附上了两个可复制的、可复制和粘贴的示例来证明。

问题

说真的,WTF ?这是一个错误还是预期的行为?我是否违反了导致此问题的一些代码约定规则?

重现问题的代码

代码和编译结果:http://viper-7.com/SFFRLL

<?php
class foo
{
    public function foo()
    {
        echo 'Method foo() in class foo was called !';
    }
}
$foo = new foo();
if (method_exists($foo, 'foo')) {
    // The line above already triggers the execution of foo();
} 

(故意)不会重现问题的代码

代码和编译结果:http://viper-7.com/MPLe5M

<?php
class foo
{
    public function bar()
    {
        echo 'Method bar() in class foo was called !';
    }
}
$foo = new foo();
if (method_exists($foo, 'bar')) {
    // Nothing should happen
} 

删除method_exists,代码仍然会出现问题。这是因为仍然支持旧式 PHP 4 构造函数,其中构造函数以类命名。 foo::foo 是构造函数,在 new foo 上调用。