为什么这个方法没有被要求就被调用了?

时间:2013-09-29 16:17:23

标签: php oop methods

我遇到了这种非常奇怪的行为。 以下代码

class TestClass {
    function testClass() {
        echo "Don't show me!";
    }
}

$testing = new TestClass;

执行方法testClass而不调用它! 但是,如果重命名为testClass之类的其他内容,则testClass1将无法运行。 这种行为背后隐藏着“PHP魔术”吗?

EDIT。 最后,我看到这个问题对于使用PHP长大的忍者来说是微不足道的。作为最近的PHP新手,我学会了使用__construct作为构造函数。从现代教程中小心地删除了“遗物行为”。我很高兴人们意识到这是多么可怕,改变了类名并忘记改变构造函数 - 这真是一场噩梦!

2 个答案:

答案 0 :(得分:6)

在PHP5之前,__construct方法未用作类构造函数。相反,使用了与该类同名的方法。

来自documentation

  

为了向后兼容,如果PHP 5找不到给定类的__construct()函数,并且该类没有从父类继承一个函数,它将按名称搜索旧式构造函数班上的。实际上,这意味着唯一具有兼容性问题的情况是该类是否有一个名为__construct()的方法,该方法用于不同的语义。

创建一个(空)构造函数(名为__construct的方法)将阻止消息在类初始化时被回显(只有< PHP 5.3.3 *才需要):

class TestClass {
    function __construct() {

    }
    function testClass() {
        echo "Don't show me!";
    }
}
  

* As of PHP 5.3.3,与命名空间类名的最后一个元素同名的方法将不再被视为构造函数。此更改不会影响非命名空间的类。

答案 1 :(得分:1)

在旧版本的PHP中,与类名同名的方法被视为构造函数。