コンストラクタで初期化する
テクノロジ系 / class (class / new / プロパティ / メソッド / `$this` / コンストラクタ)
コンストラクタで初期化する
Lesson 8 / Chapter 6
「new してから 1 つずつ代入」は面倒
<?php $u = new User(); $u->name = "太郎"; $u->age = 20;
- インスタンスを使うたびに 3 行も書く必要がある
- 代入し忘れたまま使うとバグの原因になる
- 生成と初期化 をまとめて 1 行で済ませたい
__construct は new の瞬間に呼ばれる
<?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 行で インスタンスを作り、name と age を 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 行 で完結