当前位置:  开发笔记 > 编程语言 > 正文

__construct()vs SameAsClassName()用于PHP中的构造函数

如何解决《__construct()vsSameAsClassName()用于PHP中的构造函数》经验,为你挑选了6个好方法。

__construct()在PHP中使用构造函数代替类的名称是否有任何优势?

示例(__construct):

class Foo {
    function __construct(){
        //do stuff
    }
}

示例(命名):

class Foo {
    function Foo(){
        //do stuff
    }
}

__construct从PHP 5开始,可以使用该方法(第一个示例).

从PHP版本4到版本7,可以使用与类相同的方法作为构造函数(第二个示例).



1> Bazman..:

我同意Gizmo的优点是,如果你重命名你的课程,你不必重命名它.干.

同样,如果你有一个孩子课,你可以打电话

parent::__construct()

调用父构造函数.如果在轨道的下游更改了子类继承的类,则不必将构造调用更改为父级.

这似乎是一件小事,但是缺少将构造函数调用名称更改为父类可能会产生微妙(而不是那么微妙)的错误.

例如,如果您将一个类插入到heirachy中,但忘记更改构造函数调用,则可以开始调用祖父母而不是父代的构造函数.这通常会导致可能难以察觉的不良结果.

另请注意

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

资料来源:http://php.net/manual/en/language.oop5.decon.php


PHP 4.x构造函数样式将在PHP 7.0中弃用,并在以下主要版本中删除.http://php.net/manual/de/migration70.deprecated.php#migration70.deprecated.php4-constructors

2> Paolo Bergan..:

__construct在PHP5中引入.这是你现在应该这样做的方式.不过,我本身并不知道有什么好处.

从PHP手册:

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

如果您使用的是PHP5,我建议使用__construct以避免让PHP在其他地方使用.



3> gizmo..:

我在__construct中看到的主要优点是,如果更改类名,则不必重命名构造函数.



4> Jan Turoň..:

今天,接受的答案已经过时了.

重命名类是不好的做法:每次升级到更新版本时,都必须记住重命名的内容和位置.有时(如使用反射或复杂的依赖结构),如果没有激进的重构,这是不可能的.这是您想要避免的意外复杂性.这就是为什么名称空间被引入PHP 的原因.Java,C++或C#不使用__construct,它们使用命名构造函数,它们没有问题.

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

namespace Foo;
class Test {
  var $a = 3;

  function Test($a) {
    $this->a = $a;
  }

  function getA() {
    return $this->a;
  }
}

$test = new Test(4);
echo $test->getA(); // 3, Test is not a constructor, just ordinary function

请注意,不推荐使用命名构造函数(今天是PHP 5.5).但是,您无法预测您的类将不会在命名空间中使用,因此 __construct应该优先使用.

澄清上面提到的不良做法(丹尼斯)

在代码中的某处,您可以使用ReflectionClass :: getName() ; 当您重命名该类时,您需要记住您使用Reflection的位置,并检查getName()您的应用中的结果是否仍然一致.你需要记住的东西越多,忘记的东西就越容易导致应用程序中的错误.

父母无法控制世界上依赖于他们的所有课程.如果启用了allow_url_include,则某些其他Web可能正在使用您服务器中的类,如果重命名某个类,则可能会崩溃.在上面提到的编译语言中更糟糕的是:可以将库复制并捆绑在其他代码中.

没有理由重命名类:

如果类名冲突,请使用名称空间

如果班级责任转移,则改为派遣其他班级

在命名空间中的PHP类中,应该避免使用相同名称的方法:直观地说它应该生成一个创建类的对象; 如果它做了别的什么,为什么要给它相同的名字?它应该是一个构造函数而不是别的.主要问题是这种方法的行为取决于名称空间的使用.

PHP中的__construct构造函数没有问题.但改变命名构造函数并不是最聪明的想法.



5> Ryan McCue..:

使用__contruct()而不是ClassName()扩展类的最大优点.更容易调用parent::__construct()而不是parent::ClassName(),因为它可以在类之间重用,并且可以轻松地更改父级.



6> Levi Morriso..:

在您的示例Foo::Foo中有时称为PHP 4或旧式构造函数,因为它来自PHP 4的时代:

class Foo {
    // PHP 4 constructor
    function Foo(){
        //do stuff
    }
}

PHP 4构造函数将被弃用,但不会在PHP 7中删除.在PHP 8的任何情况下,它们将不再被视为构造函数.未来兼容性绝对是不使用此功能的一个重要原因.

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有