アクセス権を設定
アクセス権とは、クラス外からクラス内のプロパティやメソッドへのアクセスを制限するための設定です。アクセス修飾子を使用して、プロパティやメソッドに対するアクセス権を設定します。アクセス修飾子は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はクラスを継承した時に使う

