PHP 5.3.3 の時点で、私はこれを 5.6 と 7.0 でテストしました。クラスの__construct
メソッドを宣言するfinal
と、コンストラクターをオーバーライドする子クラス__construct
が PHP 4 スタイルまたは PHP 4 スタイルを使用するのを防ぐことができますClassName()
(PHP 4 スタイルは PHP の時点で非推奨であることに注意してください)。 7)。コンストラクターを宣言する子クラスを防止すると、親コンストラクターが常に呼び出されるようになります。もちろん、これにより、子クラスが独自のコンストラクターロジックを実装することはできなくなります。これには間違いなく実用的な使用例がありますが、一般的には推奨しません。
いくつかの例:
__construct
final
を宣言せずに
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