PHP - OOP - 4. アクセス権

続いてプロパティやメソッドを修飾するアクセス権について取り上げます。

アクセス権の記述

アクセス権とはプロパティやメソッドを修飾するキーワードで、外部のPHPプログラムからアクセス可能かどうかを決定するものです。

図に示しているように プロパティやメソッドのアクセス権に private を指定するとクラスの外部のPHPプログラムから直接アクセスできなくなります。

ここでは以前に作成している MyClass.php ファイルを確認してみましょう。

<?php
class MyClass
{
    public $myProperty;

    public function myMethod($x)
    {
        echo $this->myProperty . " " . $x;
    }
}

上記の MyClass クラスであれば $myProperty プロパティと myMethod メソッドには public というアクセス権を指定してます。この public というアクセス権は外部のPHPプログラムからアクセス可能であることを意味します。

PHPで利用可能なアクセス権には以下の3種類があります。

アクセス権 意味
public どこからでもアクセス可能
protected そのクラス自身、そのクラスを継承したクラス
(および親クラス)からのみアクセス可能
private そのクラス自身からのみアクセス可能

もし先ほどのプログラムの $myProperty プロパティのアクセス権に private を指定すると以下のプログラム( my_class_runner.php )は実行できなくなります。

<?php
require_once("MyClass.php");

$myClass = new MyClass();
$myClass->myProperty = "Hello"; #=> Fatal error

このように privateprotected といったキーワードを指定することで外部のPHPプログラムからのアクセスを禁止できます。

どのアクセス権を選ぶかは開発するプログラムの要件によって決まります。一般的には、プログラムの保守性を高めるためにアクセス権はなるべく狭くしておきます。 public キーワードの利用は必要最低限にとどめておくと良いでしょう。

PHPプログラムの開発(アクセス権の変更)

計算機プログラムの例題に戻りましょう。ここでは簡単な計算機クラス( SimpleCalc クラス)に定義済みの $number プロパティについて、アクセス権を public から private に変更してみましょう。

<?php
class SimpleCalc
{
    private $number;

    public function add($x)
    {
        $this->number = $this->number + $x;
    }

    public function show()
    {
        echo $this->number . PHP_EOL;
    }
}

また実行プログラム( calc_runner.php )は前回と同じものを利用しましょう。

<?php
require_once("SimpleCalc.php");

$calc = new SimpleCalc();

$calc->number = 10;

$calc->add(20);
$calc->add(30);
$calc->show();

プログラムを実行すると次のようなエラー( Fatal error )が出力されます。

$ php calc_runner.php
Fatal error: Uncaught Error: Cannot access private property SimpleCalc::$number in /home/ec2-user/environment-db/calc_runner.php:6
Stack trace:
#0 {main}
  thrown in /home/ec2-user/environment-db/calc_runner.php on line 6

このように SimpleCalc クラスの $number プロパティのアクセス権を private に変更したことで、外部のPHPプログラムから $calc->number = 10; を実行するとエラーになります。

まとめ

  • プロパティやメソッドにアクセス権を定義できる
  • アクセス権には publicprotectedprivage の3つがある
  • アクセス権によって外部のプログラムからプロパティやメソッドへのアクセスを制限できる