クラスの基本
クラス・プロパティ・メソッド・インスタンス
データ (プロパティ) と振る舞い (メソッド) を 1 つの設計図にまとめる「クラス」の最小単位を扱うトピック。関数を「データとセットで持ち運べる箱」に進化させる。
このトピックで身につくこと
- 自分でクラスを定義して
newでインスタンスを作れる - プロパティに値を入れて、メソッドから取り出せる
$thisの意味を説明できる- コンストラクタで初期化できる
public/privateの使い分けができる
前提知識の要点
このトピックに入る前に必要なのは「関数が書ける」「変数に値を入れて取り出せる」「echo で文字列を表示できる」の 3 点。他のトピックの README を読み返さずに class を単独で開始できる ように、以下を圧縮しておく。
1. 関数の基本 (引数・戻り値・型ヒント)
<?php
function greet(string $name): string {
return "こんにちは、{$name}さん";
}
echo greet("太郎");
// => こんにちは、太郎さんfunction 関数名(引数): 戻り値の型 { ... }returnで値を返す- 呼び出すときは
関数名(引数)
2. 変数とダブルクォート内の変数展開
$name = "太郎";
$age = 20;
echo "{$name} は {$age} 歳";
// => 太郎 は 20 歳'シングル'内では変数展開されない。"ダブル"を使う- 日本語や記号が直後にくる場合は
"{$var}"のように波括弧で囲む
3. 連想配列 (任意 — クラスとの違いを理解しやすくなる)
$user = ["name" => "太郎", "age" => 20];
echo $user["name"]; // => 太郎クラスはこの連想配列を「型と振る舞い付き」に進化させたもの、と考えるとよい。
ここまで読めれば 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 は丁寧に進めることを推奨。
進め方
- 各 chapter の
slide.mdを読む (3〜4 分) drill/配下の問題を順番に解く- 採点:
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 で扱う) |
$this が null / 使えない |
クラス外、または 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 でもアクセスできる (シンボリックリンク)。
このレッスンの章
スクール現場で詰まる「よくある落とし穴」
公式マニュアルには書かれていないけれど、講師として受講生がよくハマるポイントを並べました。
-
this と self の混同
`$this->prop` はインスタンス、`self::CONST` は静的メンバ/定数。`static::` は遅延静的束縛(子クラスでオーバーライド可)
-
コンストラクタを書き忘れる
PHP 8 なら `__construct(public string $name)` のコンストラクタプロモーションで一気に書ける
-
privateプロパティを継承先で使いたい
private は同クラスのみ。継承先で使うなら protected。外部公開は public