アクセス権を設定
アクセス権とは、クラス外からクラス内のプロパティやメソッドへのアクセスを制限するための設定です。アクセス修飾子を使用して、プロパティやメソッドに対するアクセス権を設定します。アクセス修飾子はpublic
private
protected
の3種類です。
public
とprivate
public
プロパティとpublic
メソッドは、どこからでもアクセスできます。private
プロパティとprivate
メソッドは、クラス外からアクセスできません。同じインスタンス内であっても、private
はクラスが違うとアクセスできません。
この例では、すべてのプロパティをprivate
、すべてのメソッドをpublic
に設定しました。このようにすると、メソッドにはアクセスできますがプロパティにはアクセスできません。
プロパティname
をpublic
にすれば、メソッドgetName()
は必要ないのではという疑問がでます。なぜこうするかというと、アクセス修飾子はアクセス権を設定できますが、Read onlyやWrite onlyを設定をすることはできません。そのため、プロパティをRead onlyにする時は、プロパティはprivate
にしてReadだけできるメソッドをpublic
にします。このようなメソッドをgetter
とよびます。また、Writeだけできるメソッドをsetter
とよびます。
PHP8.1以降では、プロパティにreadonly
を指定することが可能になりました。プロパティはできる限り readonly
に設定し、コンストラクタで初期化し、メソッドでプロパティを変更しないようにすることが推奨されています。
カプセル化
クラス外からのアクセスが不要なプロパティとメソッドをprivate
で隠蔽して、クラスの中身を意識しなくてもよくすることをカプセル化とよびます。カプセル化のメリットは、public
でクラス外からアクセスできるメソッドのみを保証すれば、その他のプロパティやメソッドはクラス内で自由に変更できることです。原則プロパティとメソッドはprivate
、必要最低限のメソッドのみをpublic
とするのがセキュアな設計です。
プロパティとメソッドはprivate
、必要最低限のメソッドのみをpublic
とする
protected
アクセス修飾子protected
のプロパティやメソッドは、クラス外からはアクセスできませんが、子クラスからはアクセスできます。内部処理用のメソッドですが、子クラスでオーバーライドしたいような時に使います。
<?php
class Person
{
protected $name;
public function __construct($name)
{
$this->name = $name;
}
public function getName()
{
return $this->name;
}
}
class Person2 extends Person
{
private $age;
public function __construct($name, $age)
{
parent::__construct($name);
$this->age = $age;
}
public function getAge()
{
return $this->name.':'.$this->age;
}
}
$person_a = new Person2('suzuki', 28);
$person_b = new Person2('tanaka', 26);
$person_a_age = $person_a->getAge();
var_dump($person_a_age);
string(7) "suzuki:28"
protected
はクラスを継承した時に使う