雑多なブログ

音楽や語学、プログラム関連の話題について書いています

PHP: コンストラクタのプロモーション

PHP8.0以降コンストラクターの引数を、オブジェクトのプロパティに設定することができるようになった。

例えば、$valueというプロパティにコンストラクタで値を代入する場面を考えてみる。

class Hoge {
    public string $vlaue;
    public int $num;

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

var_dump(new Hoge('Hello', 1));

実行結果

object(Hoge)#1 (2) {
  ["vlaue"]=>
  uninitialized(string)
  ["num"]=>
  int(1)
  ["value"]=>
  string(5) "Hello"
}

これと同じ事を、下記のようにコンストラクタの宣言だけで実現できる。

class Hoge {
    public function __construct(public string $value, public int $num) {
    }
}

var_dump(new Hoge('Hello!', 2));

実行結果

object(Hoge)#1 (2) {
  ["value"]=>
  string(6) "Hello!"
  ["num"]=>
  int(2)
}

ちなみに、普通の引数と混在させることができる。

class Hoge {
    public int $num;

    public function __construct(public string $value, int $num, public bool $flg) {
        $this->num = $num;
    }
}

var_dump(new Hoge('Hello!', 3, false));

実行結果

object(Hoge)#1 (3) {
  ["num"]=>
  int(3)
  ["value"]=>
  string(6) "Hello!"
  ["flg"]=>
  bool(false)
}

通常の引数と、プロパティになる引数が混在するのは可読性が損なわれるように思うので、どちらか一方で統一した方が良いと思う。
バリューオブジェクトのコンストラクタに適用すると良さそう。

https://www.php.net/manual/ja/language.oop5.decon.php#language.oop5.decon.constructor.promotion