ch07 7章中 7章目

ch07 — アクセス修飾子 (public / private / protected)

スライドで見る

この章を AI と学ぶ

💬 AI に聞く質問例 3 件
  1. 「ch07 — アクセス修飾子 (public / private / protected)」のつまずきやすいポイントを、初学者向けに3つ教えてください

    ChatGPT Claude Gemini

  2. 「ch07 — アクセス修飾子 (public / private / protected)」について、自分の手で試せる練習問題を3つ出してください (難易度を上げながら)

    ChatGPT Claude Gemini

  3. 「ch07 — アクセス修飾子 (public / private / protected)」を学んだ後、次に学ぶと良いトピックは何ですか?理由も教えてください

    ChatGPT Claude Gemini

概要

アクセス修飾子は 「プロパティやメソッドに、どこから触ってよいか」を制限する仕組み で、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 $namepublic function getName() で取り出す

protected継承 と一緒に使う修飾子なので、本格的に使うのは L9。本 chapter では「子クラスから触れる」とだけ覚える。

解説スライド 全 6 枚

右の ボタン キー(またはスワイプ)で次のスライドに進めます。 下の「縦表示」を開くと全スライドを一気に読めます。

  1. public / private / protected

    Lesson 8 / Chapter 7

  2. どこから触れるかを修飾子で決める

    修飾子 クラス内 子クラス 外 ($obj->prop)
    public
    protected
    private
    • public … どこからでも触れる (ch01〜06 で使ってきたもの)
    • private … そのクラスの中からだけ触れる
    • protected … そのクラス + 子クラスから触れる (子クラスは L9)
  3. 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 で普通に触れる
    • 「外に見せたくないデータ」を守りたい時に使う
  4. 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〇〇 という名前を付ける慣習がある
  5. なぜ private を使うのか

    • 外から勝手に変えられない → 整合性を守れる
      • 例: age-100 などの不正な値で直接書き換えられない
    • 公開している場所が分かる → 後で変更しやすい
      • $obj->name で読まれている所」を探す必要がなくなる
    • 設計図を読みやすくなるpublic の一覧を見れば「外から使えるもの」が分かる

    最初は全部 public でもよいが、慣れてきたら「外から触る必要が無いものは private」を意識する。

  6. このチャプターでできるようになること

    public / private / protected がどこから触れるかを表で言える ✅ private プロパティは外から $obj->prop で触れないと言える ✅ privatepublic メソッド (getXxx) 経由で取り出すパターンが書ける ✅ なぜ private を使うと安全になるかを 1 文で説明できる

    → ドリルへ

1 / 6
📜 スライドを全部一気に読む(縦表示)

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 文で説明できる

→ ドリルへ

この章で取り組む 演習問題の流れ (1ステップ)
  1. 01 ドリル 01 — private プロパティを getter で取り出す README.md starter.php answer.php

演習問題の詳細

この章の演習問題の内容を読めます。実際に手元で解くには教材リポジトリを clone してください。

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

問題

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

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

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

期待される出力:

太郎

ヒント

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

🧪 ブラウザで試す

スライドのコードを写経して ▶ 実行、自分で書いて 📝 採点 で答え合わせ。初回のみ PHP ランタイム読込で数秒かかります。

PHP ランタイム未読込

          

        

演習問題(1問)

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

    README.md starter.php answer.php

サイト内で問題文・雛形・解答例を確認できます。実際に手元で解くには教材リポジトリを clone してください。

完了にすると進捗に反映されます