《PHP8上級試験対策》アクセス修飾子(public / protected / private)の違いを整理する

  • URLをコピーしました!

はじめに

PHP のクラスでは、プロパティやメソッド、定数に アクセス修飾子 を指定してアクセス範囲を制御します。試験でも頻出のポイントであり、実務でも「なぜアクセスできないのか?」というバグに直結しやすいテーマです。今回は public / protected / private の違いと、それぞれの挙動を実行結果を交えて整理します。

キーワード: public / protected / private / アクセス修飾子 /

目次

アクセス修飾子とは?

アクセス修飾子はクラスの「外部からどこまで見えるか」を制御する仕組みです。
指定できるのは public / protected / private の3種類です。

表で理解するアクセス範囲

アクセス修飾子アクセス可能範囲プロパティメソッド定数試験での注意点
publicどこからでもアクセス可能(クラス内部、サブクラス、外部から)✅ 参照OK✅ 呼び出しOK✅ デフォルトで publicプロパティやメソッドは修飾子省略不可
protectedクラス内部、およびサブクラスからのみアクセス可能❌ 外部から参照不可❌ 外部から呼び出し不可PHP7.1以降は定数でも可継承でよく出題される
privateそのクラス内部のみアクセス可能(サブクラスでも不可)❌ 外部から参照不可❌ 外部から呼び出し不可PHP7.1以降は定数でも可サブクラスからも見えない点がひっかけ

サンプルコードと実行結果

<?php
declare(strict_types=1);
error_reporting(-1);

class Hoge {
    const STR = "string";
    protected int $num;

    public function setNum(int $i) {
        $this->num = $i;
        echo "set num is {$i}\n";
    }
}

$obj = new Hoge();
echo Hoge::STR , "\n";   // 定数は public なので参照可能
$obj->setNum(123);       // メソッドは public なので呼び出し可能
echo $obj->num , "\n";   // ← protected なので外部から参照不可

実行結果

string
set num is 123

Fatal error: Uncaught Error: Cannot access protected property Hoge::$num ...

$obj->num にアクセスしようとした瞬間にエラーが出ます。これは protected プロパティはクラス外から直接参照できない ため、仕様通りの挙動です。

値を外部に公開したい場合

外部からプロパティを取得したい場合は getter メソッドを用意します。

public function getNum(): int {
    return $this->num;
}

このように「どこまで見せるか」を設計するのがオブジェクト指向の基本です。

まとめ

  • public : どこからでもアクセス可能
  • protected : クラス内部+サブクラスのみ
  • private : クラス内部のみ
  • 定数はデフォルトで public
  • プロパティやメソッドは修飾子を必ず指定する

試験では「外部から参照できるか」「サブクラスからアクセスできるか」がよく問われます。

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次