【PHP】アクセス修飾子とは? カプセル化についても解説します。

PHP

【PHP】アクセス修飾子とは?クラスのカプセル化についても解説

なやむくん
「public」や「private」の記述の意味を知りたい…。
なやむさん
カプセル化について理解ができない…。

などの疑問や悩みを解決してまいります。

アクセス修飾子とは

アクセス修飾子とは、クラスのプロパティやメソッドへのアクセス範囲を制御するためのキーワードです。

みつた
クラス内に定義されるプロパティやメソッドを、まとめてクラスメンバとも言います。

PHPには主にpublicprivateprotectedの3種類のアクセス修飾子があります 。

これらを使い分けることで、オブジェクト指向プログラミングにおけるカプセル化を実現し、データの保護やクラスの責務を明確にすることができます。

なやむさん
カプセル化とは何ですか?
みつた
先にアクセス修飾子について解説して、本記事の最後にカプセル化について解説しますね!

public

public修飾子が付けられたメンバは、クラスの外部からもアクセス可能です。

どこからでもアクセスできるため、他のオブジェクトやクラスから直接参照できます。

class PublicExample {
    public $value = "I am public"; // publicメンバ

    public function getValue() {
        return $this->value; // publicメンバにアクセス
    }
}

// 使用例
$example = new PublicExample();
echo $example->getValue(); // "I am public" と出力

protected

protected修飾子が付けられたメンバは、同じクラス内およびそのクラスを継承したサブクラスからアクセス可能ですが、クラスの外部からはアクセスできません

これにより、サブクラスに対して特定のデータやメソッドを隠すことができます。

class ProtectedExample {
    protected $value = "I am protected"; // protectedメンバ

    protected function getValue() {
        return $this->value; // protectedメンバにアクセス
    }
}

class ChildProtectedExample extends ProtectedExample {
    public function displayValue() {
        return $this->getValue(); // 子クラスからprotectedメンバにアクセス
    }
}

// 使用例
$childExample = new ChildProtectedExample();
echo $childExample->displayValue(); // "I am protected" と出力

// 以下はサブクラス以外からアクセスしようとした場合
$example = new ProtectedExample();

// 直接アクセスしようとするとエラーが発生する
echo $example->value; // エラー: protectedプロパティにはクラス外部からアクセスできません
echo $example->getValue(); // エラー: protectedメソッドにはクラス外部からアクセスできません

private

private修飾子が付けられたメンバーは、そのクラス内からのみアクセス可能で、サブクラスや外部クラスからはアクセスできません

この修飾子を使用することで、クラス内部の実装を完全に隠蔽し、外部からの不正なアクセスを防ぐことができます。

class PrivateExample {
    private $value = "I am private"; // privateメンバ

    private function getValue() {
        return $this->value; // privateメンバにアクセス
    }

    public function displayValue() {
        return $this->getValue(); // 同じクラスからprivateメンバにアクセス
    }
}

// 使用例
$privateExample = new PrivateExample();
echo $privateExample->displayValue(); // "I am private" と出力

// 以下はクラス外部からアクセスしようとした場合
echo $privateExample->value; // エラー: privateプロパティにはクラス外部からアクセスできません
echo $privateExample->getValue(); // エラー: privateメソッドにはクラス外部からアクセスできません

アクセス修飾子を使用しない場合

アクセス修飾子を指定しない場合、PHPではデフォルトでプロパティやメソッドはpublicとして扱われます。

つまり、以下のように書くことも可能です。

class Example {
    $value = "I am public"; // デフォルトはpublic

    function getValue() {
        return $this->value; // デフォルトはpublic
    }
}

// 使用例
$example = new Example();
echo $example->getValue(); // "I am public" と出力

カプセル化の概念

カプセル化とは、オブジェクト指向プログラミングにおいて、プロパティやメソッドをクラス内部に隠し、外部から直接アクセスできないようにする概念です。

アクセス修飾子によって外部からのアクセス範囲が制御され、クラス外からは公開されたインターフェースを通じてのみデータにアクセスできるため、不正な操作や意図しない変更を防ぐことができます。

まとめ

アクセス修飾子は以下のように比較ができます。

アクセス修飾子アクセスできる場所サブクラスからのアクセスクラス外部からのアクセス主な用途
publicクラス内部・クラス外部すべて可能可能外部から自由にアクセスさせたい機能
private同じクラス内のみ不可不可クラス内でのみ使用されるデータや機能を保護
protected同じクラスおよび継承されたサブクラス内可能不可継承関係にあるクラスで共有したいデータや機能
publicprivateprotected のアクセス修飾子の比較

アクセス修飾子を使用することで、クラスの外部から意図しないメンバの変更や不正な操作を防ぐことができるカプセル化の概念を実現することができます。

それぞれのアクセス修飾子の効力を理解し、PHPを使った開発に活かしていただけると幸いです!

  • この記事を書いた人
  • 最新記事

みつた

完全未経験&異業種から30歳の年でIT企業に転職。

Web系開発言語が好き。
どちらかというとバックエンドよりもフロントエンドが好き(現時点では…)

最近はサウナと観葉植物にハマっている。
野球が好きで一応投手。

-PHP