-2

问题

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
} 
4

1 回答 1

5

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

于 2013-11-07T22:29:42.477 回答