PHPは、図のように、あまりにも長い間その派生アクセスレベルが同じか、親のより弱いと、親フィールドをシャドウイングできます。1.PHPのシャドウイング親フィールドは厳密に間違っていますか?
図1
class A {
protected $x;
function f() {
return $this->x;
}
}
class B extends A {
protected $x = 'foo';
}
(new B)->f(); // 'foo'
シャドウイングは、取るために、ここで使用されていますPHPのフィールド初期化の利点しかし、そのようなPhp Inspections (EA Extended)などの一部のリンターが、これは間違っている警告し、その代わりに、図2にB
の実装を書き換えることにより
図2
class A {
protected $x;
function f() {
return $this->x;
}
}
class B extends A {
function __construct() {
$this->x = 'foo';
}
}
(new B)->f(); // 'foo'
のように、代わりにフィールドを初期化するコンストラクタを使用することをお勧めしますコンストラクタの初期化を使用すると、シャドーイングをまったく使用する必要はありません。
シャドウイングは厳密に間違っていますか?そうでない場合は、いつシャドーイングを許可するのですか?