>问题
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
上调用。