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

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

テクノロジ系 / class (class / new / プロパティ / メソッド / `$this` / コンストラクタ)

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

Lesson 8 / Chapter 6

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

<?php
$u = new User();
$u->name = "太郎";
$u->age  = 20;
  • インスタンスを使うたびに 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
  • メソッド名は 必ず __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;
}
  • 左辺の $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";

実行結果:

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

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

__construct という特別なメソッドが new の瞬間に呼ばれると言える

✅ コンストラクタ引数でプロパティを初期化できる

$this->prop = $引数; のパターンを書ける

new クラス名(引数, ...) で 1 行で生成・初期化できる

→ ドリルへ

考えてみよう

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

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

問題

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

  • public string $name;
  • public int $age;
  • public function __construct(string $name, int $age) で 2 つのプロパティを初期化する

new User("太郎", 20)1 行で インスタンスを作り、nameage を 1 行ずつ出力してください。

期待される出力:

太郎
20

採点

php scripts/grade.php topics/class/ch06-constructor/drill/01-init/

ヒント

  • メソッド名は __construct (アンダースコア 2 つ)
  • $this->name = $name; $this->age = $age; の 2 行で初期化
  • 呼び出しは $u = new User("太郎", 20);1 行 で完結