__construct()在PHP中使用构造函数代替类的名称是否有任何优势?
示例(__construct):
class Foo {
function __construct(){
//do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
示例(命名):
class Foo {
function Foo(){
//do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
__construct从PHP 5开始,可以使用该方法(第一个示例).
从PHP版本4到版本7,可以使用与类相同的方法作为构造函数(第二个示例).
Baz*_*man 70
我同意Gizmo的优点是,如果你重命名你的课程,你不必重命名它.干.
同样,如果你有一个孩子课,你可以打电话
parent::__construct()
Run Code Online (Sandbox Code Playgroud)
调用父构造函数.如果在轨道的下游更改了子类继承的类,则不必将构造调用更改为父级.
这似乎是一件小事,但是缺少将构造函数调用名称更改为父类可能会产生微妙(而不是那么微妙)的错误.
例如,如果您将一个类插入到heirachy中,但忘记更改构造函数调用,则可以开始调用祖父母而不是父代的构造函数.这通常会导致可能难以察觉的不良结果.
另请注意
从PHP 5.3.3开始,与命名空间类名的最后一个元素同名的方法将不再被视为构造函数.此更改不会影响非命名空间的类.
资料来源:http://php.net/manual/en/language.oop5.decon.php
Pao*_*ino 20
__construct在PHP5中引入.这是你现在应该这样做的方式.不过,我本身并不知道有什么好处.
从PHP手册:
为了向后兼容,如果PHP 5找不到给定类的__construct()函数,它将按类的名称搜索旧式构造函数.实际上,这意味着唯一具有兼容性问题的情况是该类是否有一个名为__construct()的方法,该方法用于不同的语义
如果您使用的是PHP5,我建议使用__construct以避免让PHP在其他地方使用.
Jan*_*roň 10
今天,接受的答案已经过时了.
重命名类是不好的做法:每次升级到更新版本时,都必须记住重命名的内容和位置.有时(如使用反射或复杂的依赖结构),如果没有激进的重构,这是不可能的.这是您想要避免的意外复杂性.这就是为什么名称空间被引入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
Run Code Online (Sandbox Code Playgroud)
请注意,不推荐使用命名构造函数(今天是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
}
}
Run Code Online (Sandbox Code Playgroud)
PHP 4构造函数将被弃用,但不会在PHP 7中删除.在PHP 8的任何情况下,它们将不再被视为构造函数.未来兼容性绝对是不使用此功能的一个重要原因.
在 PHP 7 中,将删除将构造函数创建为与类同名的函数的选项。如果你仍然这样做,你会得到一个E_DEPRECATED。
您可以在这里阅读有关此提案的更多信息(该提案已被接受): https: //wiki.php.net/rfc/remove_php4_constructors
以及那里的引用:
每当定义 PHP 4 构造函数时, PHP 7都会发出E_DEPRECATED 信号。当方法名称与类名称匹配、该类不在命名空间中并且不存在 PHP 5 构造函数 (__construct) 时,将发出 E_DEPRECATED。PHP 8 将停止发出 E_DEPRECATED 并且这些方法将不会被识别为构造函数。
E_STRICT另外,如果您定义与类同名的方法 AND a ,则在 PHP 7 中不会得到 a __construct()。
您也可以在这里看到这一点:
当存在与类同名的方法以及 __construct 时,PHP 7也将停止发出 E_STRICT 。
所以我建议您使用__construct(),因为将来您会遇到更少的问题。