今天,公认的答案已经过时了。
重命名类是不好的做法:每次升级到较新版本时,您都必须记住要重命名的内容和位置。有时(比如使用反射或复杂的依赖结构)如果不进行彻底的重构是不可能的。这是您要避免的意外复杂性。这就是命名空间被引入 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();当你重命名类时,你需要记住你在哪里使用了反射,并检查getName()
结果在你的应用程序中是否仍然一致。您需要记住的特定内容越多,就越有可能忘记某些内容,从而导致应用程序出现错误。
父母无法控制世界上所有依赖他们的班级。如果启用了allow_url_include,则其他一些网站可能正在使用您服务器中的类,如果您重命名某个类,它可能会崩溃。在上面提到的编译语言中情况更糟:该库可以复制并捆绑在其他代码中。
没有理由重命名类:
- 如果类名冲突,使用命名空间
- 如果类责任转移,则派生一些其他类
在命名空间中的 PHP 类中,无论如何都应该避免使用同名的方法:直观地说,它应该产生一个创建该类的对象;如果它做其他事情,为什么要给它同样的名字?它应该是一个构造函数,没有别的。主要问题是这种方法的行为取决于命名空间的使用。
PHP 中的 __construct 构造函数没有问题。但改变命名构造函数并不是最聪明的主意。