__construct()
在PHP中使用构造函数代替类的名称是否有任何优势?
示例(__construct
):
class Foo { function __construct(){ //do stuff } }
示例(命名):
class Foo { function Foo(){ //do stuff } }
__construct
从PHP 5开始,可以使用该方法(第一个示例).
从PHP版本4到版本7,可以使用与类相同的方法作为构造函数(第二个示例).
我同意Gizmo的优点是,如果你重命名你的课程,你不必重命名它.干.
同样,如果你有一个孩子课,你可以打电话
parent::__construct()
调用父构造函数.如果在轨道的下游更改了子类继承的类,则不必将构造调用更改为父级.
这似乎是一件小事,但是缺少将构造函数调用名称更改为父类可能会产生微妙(而不是那么微妙)的错误.
例如,如果您将一个类插入到heirachy中,但忘记更改构造函数调用,则可以开始调用祖父母而不是父代的构造函数.这通常会导致可能难以察觉的不良结果.
另请注意
从PHP 5.3.3开始,与命名空间类名的最后一个元素同名的方法将不再被视为构造函数.此更改不会影响非命名空间的类.
资料来源:http://php.net/manual/en/language.oop5.decon.php
__construct
在PHP5中引入.这是你现在应该这样做的方式.不过,我本身并不知道有什么好处.
从PHP手册:
为了向后兼容,如果PHP 5找不到给定类的__construct()函数,它将按类的名称搜索旧式构造函数.实际上,这意味着唯一具有兼容性问题的情况是该类是否有一个名为__construct()的方法,该方法用于不同的语义
如果您使用的是PHP5,我建议使用__construct
以避免让PHP在其他地方使用.
我在__construct中看到的主要优点是,如果更改类名,则不必重命名构造函数.
今天,接受的答案已经过时了.
重命名类是不好的做法:每次升级到更新版本时,都必须记住重命名的内容和位置.有时(如使用反射或复杂的依赖结构),如果没有激进的重构,这是不可能的.这是您想要避免的意外复杂性.这就是为什么名称空间被引入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构造函数没有问题.但改变命名构造函数并不是最聪明的想法.
使用__contruct()
而不是ClassName()
扩展类的最大优点.更容易调用parent::__construct()
而不是parent::ClassName()
,因为它可以在类之间重用,并且可以轻松地更改父级.
在您的示例Foo::Foo
中有时称为PHP 4或旧式构造函数,因为它来自PHP 4的时代:
class Foo { // PHP 4 constructor function Foo(){ //do stuff } }
PHP 4构造函数将被弃用,但不会在PHP 7中删除.在PHP 8的任何情况下,它们将不再被视为构造函数.未来兼容性绝对是不使用此功能的一个重要原因.