【问题标题】:Why is this method called without being asked to?为什么在不被要求的情况下调用此方法?
【发布时间】:2013-09-29 16:17:23
【问题描述】:

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

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

$testing = new TestClass;

在没有被调用的情况下执行它的方法testClass! 但是,如果重命名为 testClass1 之类的其他名称,testClass 将不会运行。 这种行为背后是否有任何隐藏的“PHP 魔法”?

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

【问题讨论】:

  • 一个名称为 name 作为它所属的类的方法将被视为类构造函数。
  • 此方法testClass() 与类本身的名称相同。它的操作类似于__construct() 方法。不过,通常最好使用__construct(),因为这样更容易阅读。
  • 如果你不想调用它,添加另一个方法并将其命名为 __construct 然后类将使用 __construct 作为类构造函数,而不是与类同名的方法。
  • 我们很少看到像这样好的、最少的代码示例。我很震惊:) 赞成。
  • 谢谢,找到了参考php.net/manual/en/language.oop5.decon.php,虽然“从 PHP 5.3.3 开始,与命名空间类名的最后一个元素同名的方法将不再被视为构造函数。这个更改不会影响非命名空间类。”相当混乱!

标签: php oop methods


【解决方案1】:

在 PHP5 之前,__construct 方法未被用作类构造函数。而是使用了与类同名的方法。

来自documentation

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

创建一个(空)构造函数(名为__construct 的方法)将阻止消息在类初始化时被回显(仅

class TestClass {
    function __construct() {

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      • 2018-06-24
      • 2012-03-02
      • 1970-01-01
      相关资源
      最近更新 更多