採点されません。匿名です。 間違えることは学習の一部です。読むだけでもかまいません。

`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 で触れないと言える

privatepublic メソッド (getXxx) 経由で取り出すパターンが書ける

✅ なぜ private を使うと安全になるかを 1 文で説明できる

→ ドリルへ

考えてみよう

既定では正解・不正解の判定はしません。自分のペースで「答えを見る」を。採点してほしい場合だけ「採点してほしい」を押してください。

ドリル 01 — private プロパティを getter で取り出す

問題

User クラスを定義してください。

  • private string $name; (private を必ず使う)
  • public function __construct(string $name)$this->name を初期化する
  • public function getName(): string$this->namereturn する

new User("太郎") でインスタンスを作り、getName() の戻り値を出力してください。

期待される出力:

太郎

採点

php scripts/grade.php topics/class/ch07-visibility/drill/01-private-getter/

ヒント

  • プロパティの修飾子は private にする (public だと採点の意図がブレるのでダメ)
  • $u->name で取ろうとするとエラーになる。必ず $u->getName() で取り出す
  • メソッドの中なら $this->name で問題なく触れる