【问题标题】:What's difference between __construct and function with same name as class has? [duplicate]__construct 和与类同名的函数有什么区别? [复制]
【发布时间】:2011-10-15 22:04:34
【问题描述】:

可能重复:
what is the function __construct used for?

__construct 函数和类同名函数有区别吗?

class foo {
    function foo ($something){
        echo "I see ".$something." argument";
    }
}

class bar {
    function __construct ($something){
        echo "<br />
            I see ".$something." argument again";
    }
}

$foo = new foo("foo");
$bar = new bar("bar");

【问题讨论】:

标签: php class function constructor


【解决方案1】:

命名的方法是PHP4构造函数的方式。

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

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

http://www.php.net/manual/en/language.oop5.decon.php

【讨论】:

  • 出于好奇,我敢于“为什么”……为什么他们会改变?将构造函数名称作为类名有什么问题...为什么他们必须引入那个(丑陋的)__construct ...
  • @ring0 可能是因为__construct 语法更符合所有其他magic methods,这就是构造函数。此外,此更改使类名可用作常规类方法。
  • @ring0:最重要的原因是削减不必要的依赖/冗余的一般原则。你有没有发现自己在重构工作中的深夜更改了类名?然后由于忘记重命名其中一个构造函数而在整个晚上进行调试(由于您的孩子打断:“爸爸,你为什么不睡觉?我们今晚也可以熬夜吗?”)?使用__construct(),既不存在这种风险,也不存在不必要的额外输入。它甚至是免费的。
  • @lunakid 这是一个有效的观点。但是这些 magic 方法值得拥有该属性...... PHP 人员添加了一些 '__' 以(通常)防止与现有方法的名称冲突;那个更好吗?至少在 C++ 构造函数中没有返回值,因此如果类被重命名,编译将失败(在 PHP 中不会出现这种情况)。 IMO,最好是在实际方法名称之前创建一个适当的 constructor 关键字,而不是通常的 functionconstructor myConstruct() {...}。但这可能会给 PHP 团队更多的工作......
【解决方案2】:

与类同名的构造函数是 PHP4 的向后兼容特性。自 PHP 5.3.3 起,它不适用于命名空间类

如果__constructclass-named 函数都存在,则__construct 用作构造函数。

【讨论】:

    【解决方案3】:

    第一个是旧的 php4 风格的“构造”。与__construct基本相同。

    【讨论】:

      【解决方案4】:

      不同之处在于不推荐使用同名的类调用构造函数。

      【讨论】:

      • 当使用没有命名空间的类时,它不被弃用。查看批准的答案和周围的 cmets。
      【解决方案5】:

      不同之处在于 PHP 5.3.3 及以上版本将function foo() 视为常规方法而不是构造函数。以前的版本会将其视为构造函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-21
        • 2011-10-01
        • 1970-01-01
        • 2020-04-04
        • 1970-01-01
        • 2020-11-27
        • 2019-01-17
        • 1970-01-01
        相关资源
        最近更新 更多