前回のmatch式の紹介に続き、PHP8.0で導入されたsyntaxの紹介です。
今回は Constructor Property Promotion について。

Constructor Property Promotion

Classにおいてコンストラクタの引数に指定した値をそのままプロパティに割り当てる事がよくあります。
例えば、以下のように。

class Person
{
    public string $name;
    public int $age;
    public string $sex;

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

上記ではインスタンスプロパティを宣言し、コンストラクタ内の処理で値をセットしています。
引数に指定した変数を何度も書かなければならないので冗長ですね。

PHP8.0からは次のように、
引数にアクセス修飾子(public, protected, private)を付与することでプロパティの宣言と値のセットを同時に行うことができます。

class Person
{
    public function __construct(
        public string $name,
        public int $age,
        public string $sex
    ) {}

簡潔になりスッキリしました。

プロパティへの値の割当はコンストラクタの処理が走る前に行われるので、
コンストラクタ内で参照する事もできます。

class Person
{
    public $initial;

    public function __construct(public string $name)
    {
        // イニシャルを取得
        $this->initial = strtoupper(substr($this->name, 0, 1));
    }
}

// インスタンス生成時にイニシャルが割り当てられている
$person = new Person('Steve');
echo $person->initial;

>>> 'S'

導入する事でシンプルに行数が減るので良いのですが、
既存のプロジェクトのクラスを全て書き換えるのは骨が折れそうです。

何か一括で書き換える方法は無いものかと調べた処、
Rectorというツールでできることが分かりました。
次回の記事でその手順を紹介させていただきます。

By hikaru