В РНР 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
Я понимаю, почему вы не доверяете PHP программистов, но я не понимаю, почему вы все равно :-) –
Я просто пытаюсь быть явным с моим кодом –