クラスの基本

クラス・プロパティ・メソッド・インスタンス

クラスは設計図、インスタンスは実体
クラスは設計図、インスタンスは実体

データ (プロパティ) と振る舞い (メソッド) を 1 つの設計図にまとめる「クラス」の最小単位を扱うトピック。関数を「データとセットで持ち運べる箱」に進化させる。

このトピックで身につくこと

  • 自分でクラスを定義して new でインスタンスを作れる
  • プロパティに値を入れて、メソッドから取り出せる
  • $this の意味を説明できる
  • コンストラクタで初期化できる
  • public / private の使い分けができる

前提知識の要点

このトピックに入る前に必要なのは「関数が書ける」「変数に値を入れて取り出せる」「echo で文字列を表示できる」の 3 点。他のトピックの README を読み返さずに class を単独で開始できる ように、以下を圧縮しておく。

1. 関数の基本 (引数・戻り値・型ヒント)

<?php
function greet(string $name): string {
    return "こんにちは、{$name}さん";
}

echo greet("太郎");
// => こんにちは、太郎さん
▶ 3v4l で実行
  • function 関数名(引数): 戻り値の型 { ... }
  • return で値を返す
  • 呼び出すときは 関数名(引数)

2. 変数とダブルクォート内の変数展開

$name = "太郎";
$age  = 20;

echo "{$name} は {$age} 歳";
// => 太郎 は 20 歳
▶ 3v4l で実行
  • 'シングル' 内では変数展開されない。"ダブル" を使う
  • 日本語や記号が直後にくる場合は "{$var}" のように波括弧で囲む

3. 連想配列 (任意 — クラスとの違いを理解しやすくなる)

$user = ["name" => "太郎", "age" => 20];
echo $user["name"];  // => 太郎
▶ 3v4l で実行

クラスはこの連想配列を「型と振る舞い付き」に進化させたもの、と考えるとよい。

ここまで読めれば ch01 から始められる。

chapter 一覧

chapter 内容 学習目標
ch01-class-def/ クラスの定義 class Name { ... } で設計図を書ける
ch02-new-instance/ インスタンス生成 new Name() で実体を作れる
ch03-properties/ プロパティの読み書き $obj->prop で値を入れたり取り出したりできる
ch04-methods/ メソッド定義と呼び出し クラス内に関数を書いて $obj->method() で呼べる
ch05-this/ $this でプロパティを参照 メソッド内から $this->prop で自分のプロパティを使える
ch06-constructor/ コンストラクタ __construct で生成時に初期化できる
ch07-visibility/ アクセス修飾子 public / private / protected の違いを言える

合計 7 chapter / 10 drill / 所要 3〜4 時間 程度。クラスは初めて触ると概念が重いので、ch01〜ch03 は丁寧に進めることを推奨。

進め方

  1. 各 chapter の slide.md を読む (3〜4 分)
  2. drill/ 配下の問題を順番に解く
  3. 採点: php scripts/grade.php topics/class/<chapter>/drill/<drill>/

つまづきポイント

症状 多くの原因
Call to undefined method new し忘れて、クラス名のまま Name::method() のように呼んでいる
Undefined property プロパティ宣言を書いていない (PHP 8.2 以降は必須)
Cannot access private property private のプロパティに外から $obj->prop で触っている (ch07 で扱う)
$thisnull / 使えない クラス外、または static メソッド内で $this を使っている
__construct が動かない スペル違い (__contruct / _construct) や function のつけ忘れ

関連トピック

トピック 関係
function このトピックの前提 (関数の基本)
class-advanced クラスを継承・抽象化・interface で発展させる
exception Exception もクラスの一種 / カスタム例外を作る
array-multi オブジェクトリストをクラスで表現する選択肢になる

トピックを並列で参照する全体地図は TOPICS_INDEX.md にある。

案件 (dojo_map.tsv) での参照

topic_slug    chapter_dir
class         topics/class/ch01-class-def
class         topics/class/ch04-methods
class         topics/class/ch06-constructor
...

slug class で参照可。08-class / class どちらの path でもアクセスできる (シンボリックリンク)。

このレッスンの章

  1. ch01 ch01 — クラスを定義する
  2. ch02 ch02 — new でインスタンスを作る
  3. ch03 ch03 — プロパティを読み書きする
  4. ch04 ch04 — メソッドを定義して呼ぶ
  5. ch05 ch05 — $this でプロパティを参照する
  6. ch06 コンストラクタで初期化する
  7. ch07 ch07 — アクセス修飾子 (public / private / protected)

スクール現場で詰まる「よくある落とし穴」

公式マニュアルには書かれていないけれど、講師として受講生がよくハマるポイントを並べました。

  1. this と self の混同

    `$this->prop` はインスタンス、`self::CONST` は静的メンバ/定数。`static::` は遅延静的束縛(子クラスでオーバーライド可)

  2. コンストラクタを書き忘れる

    PHP 8 なら `__construct(public string $name)` のコンストラクタプロモーションで一気に書ける

  3. privateプロパティを継承先で使いたい

    private は同クラスのみ。継承先で使うなら protected。外部公開は public