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

时间:2013-11-07 22:27:34

标签: php

问题

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();
} 

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

代码&amp;汇总结果: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
} 

1 个答案:

答案 0 :(得分:5)

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

相关问题