You are currently viewing 【PHP】クラスの定義「アクセス修飾子(public…など)」について【入門】

【PHP】クラスの定義「アクセス修飾子(public…など)」について【入門】

  • 投稿者:
  • 投稿カテゴリー:PHP


PHPの全目次

クラスの定義の目次

アクセス修飾子

アクセス修飾子とはメンバー変数やメソッドにどこからアクセスできるかを指定するものです。指定には「public」「private」「protected」の3つのどれかを指定します。

まずメンバー変数に指定した場合を見てみましょう。

class Test{  public メンバー変数名;  private メンバー変数名;  protected メンバー変数名;}

上記のように、メンバー変数の前にアクセス修飾子を付けることで、そのメンバー変数へのアクセス可能範囲を指定できます。

それぞれのアクセス修飾子毎に、アクセス権がどのようになるかは次の通りです。

public     クラス内、クラス外のどこからでもアクセス可能private    同じクラス内からのみアクセス可能protected  同じクラス、及び子クラスからアクセス可能

「protected」はクラスの継承を行った時に関係してきますので、ここでは「public」と「private」に絞って見てみます。

まず「public」です。「public」は基本的にアクセスに制限がかかりませんのでクラス内からでもクラス外からでもアクセスが許可されます。具体的には今までのサンプルで見てきたようにクラス内のメソッド内から参照されたり、クラスからオブジェクトを作成し、オブジェクトからメンバー変数の値を獲得したり変更したりといったことが可能です。

$tv = new Television();$tv->channelNo = 9;$tv->setChannel(5);
class Television(){  public $channelNo;
  function setChannel($channel){    $this->channelNo = $channel;    $this->dispChannel();  }}

これに対して「private」を指定した場合には、同じクラス内からはアクセス出来ますが、クラスの外からはアクセスが出来なくなります。つまりクラスからオブジェクトを作成し、そのオブジェクトを経由してメンバー変数の値を確認することが出来ません。

サンプルコード

▼Example-class3-1.php

<!DOCTYPE html><html lang=”ja”><head><title>PHP TEST</title></head><body>

<?php

$tv = new Television();$tv->channelNo = 5;$tv->dispChannel();

class Television{  private $channelNo;

  function dispChannel(){    print(‘現在のチャンネルは’.$this->channelNo);  }}

?></body></html>

上記のファイルをwwwサーバに設置しブラウザ経由で見ると画面には何も表示されずWWWサーバのエラーログに下記のように出力されます。

「private」なメンバ変数にクラスから作成したオブジェクト経由でアクセスしようとした為にエラーとなりました。このようにクラス外部からのアクセスを制限したい場合に「private」を使用します。

メンバーメソッドへのアクセス修飾子の適用

メンバメソッドに対しても同じようにアクセス修飾子を指定できます。今までのサンプルでもそうでしたが、アクセス修飾子を指定しない場合には「public」が指定されたものとみなされます。それに対して「private」を指定した場合には、クラス内部からしか(クラス内の他のメソッド内からしか)アクセスが許可されなくなります。

アクセス修飾子を付ける場合には、メソッドを表す「function」の前に記述します。

class Test{  public function メソッド名(){  }
  private function メソッド名(){  }
  protected function メソッド名(){  }}

例えば下記のような使い方を行います。

$tv = new Television();$tv->setChannel(5);
class Television{  private $channelNo;
  private function dispChannel(){    print(‘現在のチャンネルは’.$this->channelNo);  }
  public function setChannel($channel){    $this->channelNo = $channel;    $this->dispChannel();  }}

上記では「dispChannel」メソッドの前に「private」を付与してみました。「dispChannel」メソッドは同じクラス内である「setChannel」メソッドから呼び出されていますが、同じクラス内なので問題はありません。ただし、オブジェクトから直接「dispChannel」を呼ぶことは出来なくなりました。

アクセス修飾子はこのようにクラス内でしか見せたくない情報を守ったり、外部から直接呼び出す必要が無いメソッドに対しては、呼び出せないようにしたりと言ったことを明確にすることが出来ます。このことにより、誤った使いかたを未然に防止したり、後からソースコードを見て、どのような目的の変数やメソッドなのかが理解しやすくなります。