PHPにも他のオブジェクト指向言語と同様に、クラスやメソッドにアクセス修飾子を指定することができます。アクセス修飾子を適切に設定することで、より安全性の高いプログラムとすることができます。
アクセス修飾子の違い
アクセス修飾子それぞれの意味は次のようなものです。
public
どこからでもアクセス可能です。アクセス修飾子がない場合は、publicを指定したものと同じになります。
protected
そのクラス自身と継承クラスからアクセス可能です。つまり非公開ですが、継承は可能となります。
private
同じクラスの中でのみアクセス可能です。非公開で継承クラスからもアクセス不可能となります。
サンプルコード
4つのメソッドを持つクラスを定義して、それぞれにアクセス修飾子をつけます。protectedの挙動を確かめるために継承クラスも用意します。
サンプルコード(Superクラス)
1 2 3 4 5 6 7 8 9 10 11 |
class Super { protected function protectedFunc(){ echo "Protected\n"; } private function privateFunc(){ echo "Private\n"; } } $super = new Super; $super->protectedFunc(); // エラーになります $super->privateFunc(); // エラーになります |
これは、privateとprotectedのメソッドにアクセスしようとしているのでエラーとなります。
次にSuperクラスを継承したSubクラスからメソッドにアクセスしてみます。
サンプルコード(Subクラス)
1 2 3 4 5 6 7 8 |
class Sub extends Super { public function publicFunc(){ parent::protectedFunc(); } } $sub = new Sub(); $sub->publicFunc(); |
実行結果
1 |
Protected |
どのアクセス修飾子を使うべきか
アクセス修飾子を指定せず、すべてをpublicにしてもプログラムの動作に支障はありません。
まずprivateにできないか考える
ですが、プログラムの安全性を高めるためには、privateにできるものはprivateにしたほうが良いでしょう。特にプロパティは、外部から変更されると困るというケースが多いです。
getter, setterメソッドをつくる
そのため、プロパティはprivateにして、プロパティを取得するメソッドと変更するメソッド(いわゆるgetter, setter)を作成し、そのメソッドでプロパティのバリデーションをするなどの手法が取られることが多いです。