从 PHP 5.3.3 开始,我已经用 5.6 和 7.0 对此进行了测试,声明__construct
类的方法final
将防止任何子类使用__construct
或 PHP 4 样式覆盖构造函数ClassName()
(请注意,PHP 4 样式自 PHP 起已弃用7)。防止子类声明构造函数将确保始终调用父构造函数。当然,这将不允许任何子类实现它们自己的构造函数逻辑。尽管我通常不建议将其作为良好实践,但肯定会有实际的用例。
一些例子:
没有宣布__construct
最终
class ParentClassWithoutFinal {
private $value = "default";
public function __construct() {
$this->value = static::class;
}
function __toString() {
return $this->value;
}
}
class ChildClassA extends ParentClassWithoutFinal {
public function __construct() {
// Missing parent::__construct();
}
}
echo (new ChildClassA()); // ouput: default
与决赛__construct
class ParentClassWithFinal extends ParentClassWithoutFinal {
public final function __construct() {
parent::__construct();
}
}
class ChildClassB extends ParentClassWithFinal {
}
echo (new ChildClassB()); // output: ChildClassB
试图__construct
在子类
中声明
class ChildClassC extends ParentClassWithFinal {
public function __construct() {
}
}
// Fatal error: Cannot override final method ParentClassWithFinal::__construct()
试图ClassName()
在子类中声明构造函数
class ChildClassD extends ParentClassWithFinal {
public function ChildClassD() {
}
}
// Fatal error: Cannot override final ParentClassWithFinal::__construct() with ChildClassD::ChildClassD()
// Also in PHP 7: Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; ChildClassD has a deprecated constructor