`public` / `private` / `protected`
テクノロジ系 / class (class / new / プロパティ / メソッド / `$this` / コンストラクタ)
public / private / protected
Lesson 8 / Chapter 7
どこから触れるかを修飾子で決める
| 修飾子 | クラス内 | 子クラス | 外 ($obj->prop) |
|---|---|---|---|
public | ◯ | ◯ | ◯ |
protected | ◯ | ◯ | ✗ |
private | ◯ | ✗ | ✗ |
public… どこからでも触れる (ch01〜06 で使ってきたもの)private… そのクラスの中からだけ触れるprotected… そのクラス + 子クラスから触れる (子クラスは L9)
private は外から直接触れない
<?php
class User {
private string $name;
public function __construct(string $name) {
$this->name = $name; // ◯ クラス内なので OK
}
}
$u = new User("太郎");
echo $u->name; // ❌ Error: 外から private には触れない- 外からの
$u->nameは エラーで停止する - 中からは
$this->nameで普通に触れる - 「外に見せたくないデータ」を守りたい時に使う
public なメソッド (getter) を用意して取り出す
<?php
class User {
private string $name;
public function __construct(string $name) {
$this->name = $name;
}
public function getName(): string {
return $this->name;
}
}
$u = new User("太郎");
echo $u->getName() . "\n"; // → 太郎- プロパティは隠して、メソッド経由で公開する
- これが「カプセル化」と呼ばれる基本パターン
- 取得用メソッドは
get〇〇という名前を付ける慣習がある
なぜ private を使うのか
- 外から勝手に変えられない → 整合性を守れる
- 例: age を -100 などの不正な値で直接書き換えられない
- 公開している場所が分かる → 後で変更しやすい
- 「$obj->name で読まれている所」を探す必要がなくなる
- 設計図を読みやすくなる →
publicの一覧を見れば「外から使えるもの」が分かる
最初は全部 public でもよいが、慣れてきたら「外から触る必要が無いものは private」を意識する。
このチャプターでできるようになること
✅ public / private / protected がどこから触れるかを表で言える
✅ private プロパティは外から $obj->prop で触れないと言える
✅ private を public メソッド (getXxx) 経由で取り出すパターンが書ける
✅ なぜ private を使うと安全になるかを 1 文で説明できる
→ ドリルへ
考えてみよう
既定では正解・不正解の判定はしません。自分のペースで「答えを見る」を。採点してほしい場合だけ「採点してほしい」を押してください。
ドリル 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() の戻り値を出力してください。
期待される出力:
太郎
採点
php scripts/grade.php topics/class/ch07-visibility/drill/01-private-getter/
ヒント
- プロパティの修飾子は
privateにする (publicだと採点の意図がブレるのでダメ) $u->nameで取ろうとするとエラーになる。必ず$u->getName()で取り出す- メソッドの中なら
$this->nameで問題なく触れる