🐘

PHP で private のプロパティを追加したら、 extends 先のプロパティを上書きはしないのか

に公開

PHPでprivateのプロパティを親クラスに追加した場合、子クラス(extends先)で同じ名前のprivateプロパティを定義しても「上書き(オーバーライド)」にはなりません。
親クラスと子クラスで同じ名前のprivateプロパティが存在した場合、それぞれのクラスごとに独立したプロパティとして扱われます。つまり、親クラスのprivateプロパティと子クラスのprivateプロパティは別物であり、同時に共存します

挙動の例

class ParentClass {
    private $value = 1;
}

class ChildClass extends ParentClass {
    private $value = 2;
}

$obj = new ChildClass();
var_dump($obj);

この場合、$objの中には

  • ["value":"ParentClass":private] => 1
  • ["value":"ChildClass":private] => 2

のように、親クラスと子クラスで別々のプロパティが存在します。

補足

  • privateプロパティは「そのクラス内でのみ」アクセス可能で、子クラスからはアクセスできません。
  • 上書きされるのはpublicやprotectedの場合で、privateの場合は「同名であっても別物」として扱われます。

結論
PHPでprivateのプロパティを追加しても、extends先(子クラス)のプロパティを上書きすることはありません。それぞれのクラスで独立して存在します。

Discussion