【PHP】ざっくりオブジェクト指向 - アクセス権とカプセル化
アクセス権を設定
アクセス権とは、クラス外からプロパティやメソッドへのアクセス可否の設定です。アクセス修飾子でプロパティとメソッドにアクセス権を設定します。アクセス修飾子はpublic
private
protected
の3種類です。
public
とprivate
public
プロパティとpublic
メソッドは、どこからでもアクセスできます。private
プロパティとprivate
メソッドは、クラス外からアクセスできません。同じインスタンス内であっても、private
はクラスが違うとアクセスできません。
この例では、すべてのプロパティをprivate
、すべてのメソッドをpublic
に設定しました。このようにすると、メソッドにはアクセスできますがプロパティにはアクセスできません。プロパティ$sex
をpublic
にすれば、メソッドgetSex()
は必要ないのではという疑問がでます。なぜこうするかというと、アクセス修飾子はアクセス権を設定できますが、Read onlyやWrite onlyを設定をすることはできません。そのため、プロパティをRead onlyにする時は、プロパティはprivate
にしてReadだけできるメソッドをpublic
にします。このようなメソッドをgetter
とよびます。また、Writeだけできるメソッドをsetter
とよびます。
PHP8.1以降で、プロパティにreadonly
を指定できるようになりました。プロパティはできるかぎりreadonly
にしてコンストラクタでセットして、メソッドでプロパティを変更しないことが望ましいです。
カプセル化
クラス外からのアクセスが不要なプロパティとメソッドをprivate
で隠蔽して、クラスの中身を意識しなくてもよくすることをカプセル化とよびます。カプセル化のメリットは、public
でクラス外からアクセスできるメソッドのみを保証すれば、その他のプロパティやメソッドはクラス内で自由に変更できることです。原則プロパティとメソッドはprivate
、必要最低限のメソッドのみをpublic
とするのが安全です。
protected
アクセス修飾子protected
のプロパティやメソッドは、クラス外からはアクセスできませんが、子クラスからはアクセスできます。内部処理用のメソッドですが、子クラスでオーバーライドしたいような時に使います。
hiroyuki@blocs ~ % php sample6-1.php
string(7) "28:male"
hiroyuki@blocs ~ %
Discussion