概要
アクセス修飾子は 「プロパティやメソッドに、どこから触ってよいか」を制限する仕組み で、PHP には public / private / protected の 3 段階がある。public は外からも内からも自由に触れる、private は そのクラスの中からしか 触れない、protected は そのクラスとその子クラスからのみ 触れる、という違いがある。アクセスを絞ることで「外から壊されたくない内部データ」を守れる。
カプセル化 (encapsulation) と呼ばれるこの考え方の動機は 「外から自由に書き換えられると、データの整合性が保てない」 ことにある。例えば年齢を 0 以上に保ちたいクラスで public $age にしていると、外から $user->age = -100; と書かれて壊れる余地が残る。private $age にして setAge(int $n) のような公開メソッド越しにだけ更新を許せば、メソッドの中でバリデーションをかけられる。
実務でよく使うパターンは 「private プロパティ + public getter / setter」。getName() で読み取り、setName(string $s) で書き込み、というインタフェースに統一しておくと、後から「読み取りを禁止する」「書き込み時にログを取る」のような変更を 1 か所だけで完結できる。protected は ch01 (継承) と組み合わせて初めて意味を持つので、本章では「子クラスから触れる修飾子」とだけ覚えておけば十分。
学習目標
public/private/protectedの違いを言えるprivateプロパティは外から直接触れない ($obj->propで失敗) と理解するprivateプロパティをpublicメソッド経由で取得するパターン (getter) を書ける
ドリル
| no | 内容 |
|---|---|
| 01 | private $name を public function getName() で取り出す |
protectedは 継承 と一緒に使う修飾子なので、本格的に使うのは L9。本 chapter では「子クラスから触れる」とだけ覚える。
📝 演習: ドリル 01 — private プロパティを getter で取り出す
問題
User クラスを定義してください。
private string $name;(privateを必ず使う)public function __construct(string $name)で$this->nameを初期化するpublic function getName(): stringで$this->nameをreturnする
new User("太郎") でインスタンスを作り、getName() の戻り値を出力してください。
期待される出力:
太郎ヒント
- プロパティの修飾子は
privateにする (publicだと採点の意図がブレるのでダメ) $u->nameで取ろうとするとエラーになる。必ず$u->getName()で取り出す- メソッドの中なら
$this->nameで問題なく触れる
🤖 この章を AI に聞く
-
「ch07 — アクセス修飾子 (public / private / protected)」のつまずきやすいポイントを、初学者向けに3つ教えてください
-
「ch07 — アクセス修飾子 (public / private / protected)」について、自分の手で試せる練習問題を3つ出してください (難易度を上げながら)
-
「ch07 — アクセス修飾子 (public / private / protected)」を学んだ後、次に学ぶと良いトピックは何ですか?理由も教えてください