MW211 EXIT

devlog
PHP/アクセス修飾子の組み合わせ(1)
2012年02月15日
継承した時のアクセス修飾子の組み合わせってどうなのかをまとめてみた。

┌──────────────────────────────────────┐
│class 親 {                                                                  │
│  public $a = '親';  ←★                                                   │
│}                                                                           │
├──────────────────────────────────────┤
│class 子 extends 親 {                                                       │
│  public $a = '子';  ←★                                                   │
│  public function method() {                                                │
│    return $this->a;                                                        │
│  }                                                                         │
│}                                                                           │
└──────────────────────────────────────┘
上記のようなクラスで、以下のようにechoした場合、
★の部分のアクセス修飾子の組み合わせで、どうなるのかを調べた。
┌──────────────────────────────────────┐
│$子 = new 子();                                                             │
│echo $子->method();                                                         │
└──────────────────────────────────────┘

結果は以下の通り(×はエラー)。
┌─────┬─────┬─────┬─────┬─────┐
│  親\子  │(定義なし)│ private  │protected │  public  │
├─────┼─────┼─────┼─────┼─────┤
│(定義なし)│    ×    │    子    │    子    │    子    │
├─────┼─────┼─────┼─────┼─────┤
│private   │    ×    │    子    │    子    │    子    │
├─────┼─────┼─────┼─────┼─────┤
│protected │    親    │    ×    │   (子)   │   (子)   │
├─────┼─────┼─────┼─────┼─────┤
│public    │    親    │    ×    │    ×    │   (子)   │
└─────┴─────┴─────┴─────┴─────┘
個人的に一方のみ定義するか、一方はprivateってのが美しい形なのではないかと思う。
よって、イレギュラーだと思うものを括弧書きにした。
これらはいわゆるオーバーライド(問答無用の上書)ってやつだ。
後はエラーになるケースを抑えておきたいところだ。
分類:PHP