PHP入門 オブジェクト指向 カプセル化

PHPのカプセル化(アクセス修飾子とアクセサーメソッド)について解説しています。

カプセル化とは

カプセル化(Encapsu-lation)とは、クラスの機能のうち、使い手に必要のない処理を隠してしまうことです。ブラックボックス化とも言います。

アクセス修飾子

クラスの世界で、不要な機能を隠す役割を担っているはアクセス修飾子です。

PHPで利用可能なアクセス修飾子

アクセス修飾子概要
publicどこからでもアクセスできる
protected現在のクラスとサブクラスでのみサクセスできる
private現在のクラスの中でのみアクセスできる

アクセサーメソッド

publicプロパティに外部から直接アクセスすることは、あまり好ましいものではありません。理由としては、負数等の予期せぬ値を入力ができたり、入力値チェックを外部で行っていたりすると条件の変更などが起こった場合、呼び出し元のコードをすべて修正が発生したりするためです。そこで、クラス内の変数に値をセットしたり外部から取得する内部変数にアクセスするメソッドを準備します。それがアクセサーメソッドです。ゲッターを介することで呼び出し側に影響することなく、取得する値を加工したりと内部実装を差し替えたりもできます。

無条件にゲッター/セッターを準備する必要はありません。不要なセッターは書かない方がよいです。

アクセサーメソッドの実装

クラス内の変数のアクセス修飾子はprivateにして、外部から直接アクセスできなくします。そのあと、クラス内の変数にアクセスさせるためのセッターメソッド/ゲッターメソッドを定義します。

<?php
class Person{
    private string $firstName;
    private string $lastName;


    //プロパティ値を初期化(コンストラクター)
    public function __construct(){
        $this->firstName = "";
        $this->lastName = "";
    }

    //firstNameプロパティのゲッター(取得)メソッド
    public function getFirstName(): string{
        return $this->firstName;
    }
    //firstNameプロパティのセッター(設定)メソッド
    public function setFirstName(string $firstName){
        if($firstName === ''){
            throw new Exception('firstNameは未入力です。');
        }
        $this->firstName = $firstName;
    }

    //firstNameプロパティのゲッター(取得)メソッド
    public function getLastName(): string{
        return $this->firstName;
    }
    //firstNameプロパティのセッター(設定)メソッド
    public function setLastName(string $lastName){
        if($lastName === ''){
            throw new Exception('lastNameは未入力です。');
        }
        $this->lastName = $lastName;
    }

    public function show():void{
        print "<p>私の名前は{$this->lastName}{$this->firstName}です</p>";
    }
}

ゲッター/セッターの呼び出し方

setLastNameに空をセットしたため、エラーとなります。これは、与えられた引数が空の場合は、例外が発生するように処理を付け加えています。

<?php
require_once 'Person.php';
$p1 = new Person();
$p1->setFirstName('太郎');
$p1->setLastName('');
$p1->show();

構文:ゲッター/セッター

public function getプロパティ名(): データ型{
  return $this->プロパティ名;
}
public function setプロパティ名(データ型 引数): void{
  $this->プロパティ名 = 引数;
}

プロパティ名の先頭に大文字にして、その前に「get」「set」を付与します。