🗂

【PHP】ざっくりオブジェクト指向 - アクセス権とカプセル化

2022/11/15に公開

アクセス権を設定

アクセス権とは、クラス外からプロパティやメソッドへのアクセス可否の設定です。アクセス修飾子でプロパティとメソッドにアクセス権を設定します。アクセス修飾子はpublic private protectedの3種類です。

publicprivate

publicプロパティとpublicメソッドは、どこからでもアクセスできます。privateプロパティとprivateメソッドは、クラス外からアクセスできません。同じインスタンス内であっても、privateはクラスが違うとアクセスできません。

この例では、すべてのプロパティをprivate、すべてのメソッドをpublicに設定しました。このようにすると、メソッドにはアクセスできますがプロパティにはアクセスできません。プロパティ$sexpublicにすれば、メソッドgetSex()は必要ないのではという疑問がでます。なぜこうするかというと、アクセス修飾子はアクセス権を設定できますが、Read onlyやWrite onlyを設定をすることはできません。そのため、プロパティをRead onlyにする時は、プロパティはprivateにしてReadだけできるメソッドをpublicにします。このようなメソッドをgetterとよびます。また、Writeだけできるメソッドをsetterとよびます。
PHP8.1以降で、プロパティにreadonlyを指定できるようになりました。プロパティはできるかぎりreadonlyにしてコンストラクタでセットして、メソッドでプロパティを変更しないことが望ましいです。

カプセル化

クラス外からのアクセスが不要なプロパティとメソッドをprivateで隠蔽して、クラスの中身を意識しなくてもよくすることをカプセル化とよびます。カプセル化のメリットは、publicでクラス外からアクセスできるメソッドのみを保証すれば、その他のプロパティやメソッドはクラス内で自由に変更できることです。原則プロパティとメソッドはprivate、必要最低限のメソッドのみをpublicとするのが安全です。

protected

アクセス修飾子protectedのプロパティやメソッドは、クラス外からはアクセスできませんが、子クラスからはアクセスできます。内部処理用のメソッドですが、子クラスでオーバーライドしたいような時に使います。

https://github.com/hyada/object-oriented-programming/blob/69ac9e1afef9b72d3b949862151df02cf7546614/code/sample6-1.php

実行結果
hiroyuki@blocs ~ % php sample6-1.php 
string(7) "28:male"
hiroyuki@blocs ~ %

ざっくりオブジェクト指向(全5記事)

  1. オブジェクト指向の必要性
  2. クラスとインスタンスと継承
  3. インスタンスを生成
  4. staticと遅延静的束縛
  5. アクセス権とカプセル化

Discussion