クラスの基本 / ch06

コンストラクタで初期化する

<!-- LLM_CONTEXT: Lesson 8 / Chapter 6 目的: __construct を定義し、new の瞬間にプロパティを初期化できるようにする 扱わない: 修飾子 (ch07) / 継承・static (L9) 読み上げ時間目安: 3 分半〜4 分 -->

コンストラクタで初期化する

Lesson 8 / Chapter 6


「new してから 1 つずつ代入」は面倒

<?php
$u = new User();
$u->name = "太郎";
$u->age  = 20;
▶ 3v4l で実行
  • インスタンスを使うたびに 3 行も書く必要がある
  • 代入し忘れたまま使うとバグの原因になる
  • 生成と初期化 をまとめて 1 行で済ませたい

__constructnew の瞬間に呼ばれる

<?php
class User {
    public string $name;
    public int $age;

    public function __construct(string $name, int $age) {
        $this->name = $name;
        $this->age  = $age;
    }
}

$u = new User("太郎", 20);

echo $u->name . "\n";  // 太郎
echo $u->age  . "\n";  // 20
▶ 3v4l で実行
  • メソッド名は 必ず __construct (アンダースコア 2 つ + construct)
  • new User("太郎", 20) のように new() に引数を書く
  • 中で $this->prop = ... でプロパティを初期化する

引数名とプロパティ名が同じ場合

public function __construct(string $name, int $age) {
    $this->name = $name;   // 左は this の name、右は引数の $name
    $this->age  = $age;
}
▶ 3v4l で実行
  • 左辺の $this->nameプロパティ
  • 右辺の $name引数
  • 同じ名前にしても混ざらない ($this-> が付いているかどうかで判別される)

1 行で生成と初期化を済ませられる

<?php
$a = new User("太郎", 20);
$b = new User("花子", 25);

echo $a->name . " (" . $a->age . ")\n";
echo $b->name . " (" . $b->age . ")\n";
▶ 3v4l で実行

実行結果:

太郎 (20)
花子 (25)
  • インスタンスを作るたびに「3 行」が「1 行」になる
  • どのプロパティを必ず初期化するかが 設計図に書かれる ので、初期化忘れも防げる

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

__construct という特別なメソッドが new の瞬間に呼ばれると言える ✅ コンストラクタ引数でプロパティを初期化できる ✅ $this->prop = $引数; のパターンを書ける ✅ new クラス名(引数, ...) で 1 行で生成・初期化できる

→ ドリルへ

演習問題(1問)

  1. ドリル 01 — コンストラクタで初期化する

    starter.php answer.php

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