PHPのアクセス修飾子public, protected, privateの違い

PHPにも他のオブジェクト指向言語と同様に、クラスやメソッドにアクセス修飾子を指定することができます。アクセス修飾子を適切に設定することで、より安全性の高いプログラムとすることができます。

アクセス修飾子の違い

アクセス修飾子それぞれの意味は次のようなものです。

public

どこからでもアクセス可能です。アクセス修飾子がない場合は、publicを指定したものと同じになります。

protected

そのクラス自身と継承クラスからアクセス可能です。つまり非公開ですが、継承は可能となります。

private

同じクラスの中でのみアクセス可能です。非公開で継承クラスからもアクセス不可能となります。

サンプルコード

4つのメソッドを持つクラスを定義して、それぞれにアクセス修飾子をつけます。protectedの挙動を確かめるために継承クラスも用意します。 サンプルコード(Superクラス)

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クラス)
class Sub extends Super {
    public function publicFunc(){
        parent::protectedFunc();
    }
}

$sub = new Sub();
$sub->publicFunc();
実行結果
Protected

どのアクセス修飾子を使うべきか

アクセス修飾子を指定せず、すべてをpublicにしてもプログラムの動作に支障はありません。

まずprivateにできないか考える

ですが、プログラムの安全性を高めるためには、privateにできるものはprivateにしたほうが良いでしょう。特にプロパティは、外部から変更されると困るというケースが多いです。

getter, setterメソッドをつくる

そのため、プロパティはprivateにして、プロパティを取得するメソッドと変更するメソッド(いわゆるgetter, setter)を作成し、そのメソッドでプロパティのバリデーションをするなどの手法が取られることが多いです。

イベント

2017/12/05(火)
Design Thinking Square