【PHP】アクセス修飾子について
前回の記事でクラス作成の基本形を学びました。これまで学んできた中で「public」というアクセス修飾子何度か使用しました。
今回はこのアクセス修飾子について記述していきます。
アクセス修飾子とは?
アクセス修飾子とは、クラス内の「メンバ変数」や「メンバメソッド」に、どこからアクセスすることができるかを定義する構文です。
アクセス権ともいい、「public」、「private」、「protected」の三種類があります。
public
「public」はクラス内、クラス外からどこからでもアクセス可能にするアクセス修飾子です。具体例を見てみましょう。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<?php class Player { //クラスを宣言 public $name; //「name」変数を宣言 public $hp; //「hp」変数を宣言 public $mp; //「mp」変数を宣言 public function __construct($name , $hp , $mp){ //コンストラクタ(インスタンス化した際の初期値入力設定) $this->name = $name; //作成するオブジェクトの「name」項目に変数「$a」を代入する $this->hp = $hp; //作成するオブジェクトの「hp」項目に変数「$b」を代入する $this->mp = $mp; //作成するオブジェクトの「name」項目に変数「$c」を代入する echo $this->name."さん、この世界にようこそ!<br>"; } public function denote_hp(){ //プレイヤーのHPを表示するメソッド echo $this->name."のHPは".$this->hp."です。<br>"; } public function denote_mp(){ //プレイヤーのMPを表示するメソッド echo $this->name."のMPは".$this->mp."です。<br>"; } } $tanaka = new Player("tanaka" , 50 , 20); //「Player」クラスから「$tanaka」オブジェクトを作成し、各項目に初期値を設定する $suzuki = new Player("suzuki" , 75 , 5); //「Player」クラスから「$suzuki」オブジェクトを作成し、各項目に初期値を設定する $tanaka->denote_hp(); //「$tanaka」のHPを表示する $suzuki->denote_mp(); //「$suzuki」のMPを表示する ?> |
インスタンス化した「$tanaka」から「$tanaka->denote_hp();」で$tanakaのHPを表示、「$suzuki」から「$suzuki->denote_mp();」で$suzukiのMPを表示するメソッドを表示しようとしています。
正常に表示されました。「public」で定義しているので、どこからでもアクセス可能、すなわち「public」で定義したプロパティやメソッドはどこからでも呼び出しや書き換えが可能になります。
private
先程のコードの「public」の部分を「private」に変えて同じ処理を実行してみます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<?php class Player { //クラスを宣言 public $name; //「name」変数を宣言 public $hp; //「hp」変数を宣言 public $mp; //「mp」変数を宣言 public function __construct($name , $hp , $mp){ //コンストラクタ(インスタンス化した際の初期値入力設定) $this->name = $name; //作成するオブジェクトの「name」項目に変数「$a」を代入する $this->hp = $hp; //作成するオブジェクトの「hp」項目に変数「$b」を代入する $this->mp = $mp; //作成するオブジェクトの「name」項目に変数「$c」を代入する echo $this->name."さん、この世界にようこそ!<br>"; } private function denote_hp(){ //プレイヤーのHPを表示するメソッド echo $this->name."のHPは".$this->hp."です。<br>"; } private function denote_mp(){ //プレイヤーのMPを表示するメソッド echo $this->name."のMPは".$this->mp."です。<br>"; } } $tanaka = new Player("tanaka" , 50 , 20); //「Player」クラスから「$tanaka」オブジェクトを作成し、各項目に初期値を設定する $suzuki = new Player("suzuki" , 75 , 5); //「Player」クラスから「$suzuki」オブジェクトを作成し、各項目に初期値を設定する $tanaka->denote_hp(); //「$tanaka」のHPを表示する $suzuki->denote_mp(); //「$suzuki」のMPを表示する ?> |
実行結果は以下の通りです。
「private」に変更した途端エラーになりました。アクセス修飾子「private」は同じクラス内からでしかアクセスすることができなくする修飾子です。外部からの呼び出しもできなくなりますが、同じクラス内から別のメソッドで呼び出すことは可能になります。
文にすると少々分かりにくいですが、クラス内に以下の構文を追記してみます。
|
1 2 3 4 5 6 |
public function denote_hp_pub(){ $this->denote_hp(); } public function denote_mp_pub(){ $this->denote_mp(); } |
同じクラス内で「private」で定義した「denote_hp();」というメソッドを「public function denote_hp_pub();」で呼び出せるようにしています。同じように「denote_mp();」も「private」で定義されていますが、「public function denote_mp_pub();」で呼び出せるようにしています。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<?php class Player { //クラスを宣言 public $name; //「name」変数を宣言 public $hp; //「hp」変数を宣言 public $mp; //「mp」変数を宣言 public function __construct($name , $hp , $mp){ //コンストラクタ(インスタンス化した際の初期値入力設定) $this->name = $name; //作成するオブジェクトの「name」項目に変数「$a」を代入する $this->hp = $hp; //作成するオブジェクトの「hp」項目に変数「$b」を代入する $this->mp = $mp; //作成するオブジェクトの「name」項目に変数「$c」を代入する echo $this->name."さん、この世界にようこそ!<br>"; } private function denote_hp(){ //プレイヤーのHPを表示するメソッド echo $this->name."のHPは".$this->hp."です。<br>"; } private function denote_mp(){ //プレイヤーのMPを表示するメソッド echo $this->name."のMPは".$this->mp."です。<br>"; } public function denote_hp_pub(){ $this->denote_hp(); } public function denote_mp_pub(){ $this->denote_mp(); } } $tanaka = new Player("tanaka" , 50 , 20); //「Player」クラスから「$tanaka」オブジェクトを作成し、各項目に初期値を設定する $suzuki = new Player("suzuki" , 75 , 5); //「Player」クラスから「$suzuki」オブジェクトを作成し、各項目に初期値を設定する $tanaka->denote_hp_pub(); //「$tanaka」のHPをメソッド「denote_hp_pub」で表示する $suzuki->denote_mp_pub(); //「$suzuki」のMPをメソッド「denote_mp_pub」で表示する ?> |
外部から、メソッド「public function denote_hp_pub();」と「public function denote_mp_pub();」を呼び出してみます。実行結果は下記画像の通です。
正常に動作しました。「private」のアクセス修飾子を持ったメソッドは直接外部から呼び出すことはできませんが、同じクラスのメソッドからなら呼び出せることが分かりました。
これだけみるとなんのためにわざわざ「private」を設定し、別のメソッドから呼び出す意味が分かりませんよね。
「private」を設定する意味
「private」は特に変更されたくない値や数式に対して設定します。「public」は外部から誰でも呼び出すことが可能になるアクセス修飾子です。故に値の書き換えが誰にでも可能になるのです。
値をむやみに書き換えて欲しくない場合などに対し、「private」を挟むことでこれを防止することができるのです。
protected
「protected」の役割は「private」に似ていますが少しだけ挙動が違います。「private」が「同じクラス内からアクセス可能」に対し、「protected」は「同じクラス内から、または子クラスからのアクセスが可能」というアクセス修飾になります。
まとめ
- アクセス修飾子とは、クラス内の「メンバ変数」や「メンバメソッド」に、どこからアクセスすることができるかを定義する構文である
- 「public」はクラス内、クラス外からどこからでもアクセス可能にする
- 「private」は同じクラス内からでしかアクセスすることができなくする
- 「protected」は同じクラス内から、または子クラスからのアクセスが可能にする


