はじめに
PHP のクラスでは、プロパティやメソッド、定数に アクセス修飾子 を指定してアクセス範囲を制御します。試験でも頻出のポイントであり、実務でも「なぜアクセスできないのか?」というバグに直結しやすいテーマです。今回は 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
- プロパティやメソッドは修飾子を必ず指定する
試験では「外部から参照できるか」「サブクラスからアクセスできるか」がよく問われます。