アクセス修飾子

広告

アクセス修飾子とはメンバ変数やメソッドにどこからアクセスできるかを指定するものです。指定には「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」を指定した場合には、同じクラス内からはアクセスできますが、クラスの外からはアクセスが出来なくなります。つまりクラスからオブジェクトを作成し、そのオブジェクトを経由してメンバ変数の値を確認することが出来ません。

サンプルコード

では今までのサンプルでメンバ変数のアクセス修飾子を「private」に変更して試してみましょう。

<html>
<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サーバのエラーログに下記のように出力されます。

[Thu Jun 22 02:41:18 2006] [error] [client 127.0.0.1] PHP Fatal error:
  Cannot access private property Television::$channelNo in D:\\Apache 
  Group\\Apache2\\htdocs\\sample\\classtest3.php on line 8

「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」を呼ぶことは出来なくなりました。

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

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。