[php8]コンストラクタのプロパティを省略する

php

コンストラクタ(constructor)のプロパティを省略する

php8からプロパティの値を定義するときに、コンストラクタに初期値と一緒に書いて、省略して定義できるようになりました。
この記事ではphp7以前のプロパティの定義方法と、php8でのプロパティ定義方法を実際にコードを書いてみて試しています。

公式の記事はこちらです。

PHP7以前の書き方を確認する

プロパティが定義されたクラスのサンプルコード

php7以前はクラスのプロパティを定義して、コンストラクタで値を設定する場合は、このように書いていました。

class UserA {
    public int $age;
    public string $name;
    public int $gender;

    public function __construct(int $age = 0, string $name = 'hoge', int $gender = 1)
    {
       $this->age = $age; 
       $this->name = $name; 
       $this->gender = $gender; 
    }
}

UserAというクラスにプロパティとして、年齢・名前・性別を用意しました。
コンストラクタで、それぞれ渡された値がプロパティに設定されます。

コードの実行

このように実行してみます。
UserAをnewして、それぞれプロパティに格納されるように値を渡しています。

$userA = new UserA(25, 'satou', 2);
var_dump($userA);

結果は、このように表示されます。
値がセットされていることが確認できました。

object(UserA)#1 (3) {
  ["age"]=>
  int(25)
  ["name"]=>
  string(5) "satou"
  ["gender"]=>
  int(2)
}

php8での書き方を確認する

プロパティ宣言省略のサンプルコード

php8では下記のように、プロパティの宣言と値を設定するコードを省略して書くことが可能になりました。
コンストラクタで受けたときに、プロパティにする引数とプロパティにしない変数を分けることも可能です。

UserAと同じように、UserBというクラスにプロパティとして、年齢・名前・性別を用意しました。

class UserB {
    public function __construct(public int $age = 0, public string $name = 'hoge', public int $gender = 1)
    {
    }
}

UserAのコンストラクタと違うところは、それぞれ値を受けるところに、アクセス修飾子(public,protected,privateいずれか)がついています。
こうすることで、プロパティ宣言と、値の設定まで行ってくれます。

コードの実行

実行してみます。

$userB = new UserB(28, 'suzuki', 1);

var_dump($userB);

結果は、このように表示されます。
UserAを使った時と同じように値が設定されていますね。

object(UserB)#2 (3) {
  ["age"]=>
  int(28)
  ["name"]=>
  string(6) "suzuki"
  ["gender"]=>
  int(1)
}

一部をプロパティにしないコンストラクタのサンプルコード

年齢と性別のアクセス修飾子を取ってみました。
こうすることで、プロパティにはなりません。名前だけプロパティとして使用されます。

class UserC {
    public function __construct(int $age = 0, public string $name = 'hoge', int $gender = 1)
    {
        $genderText = $gender == 1 ? '男':'女';
        echo "年齢:{$age} 名前:{$name} 性別:{$genderText}\n\n";
    }
}

コードの実行

下記のように実行してみます。

$userC = new UserC(31, 'taro', 1);
var_dump($userC);

実行すると、このように結果が表示されます。

年齢:31 名前:taro 性別:男

object(UserC)#3 (1) {
  ["name"]=>
  string(4) "taro"
}

コンストラクタで実行したecho関数がnewした時に走っていますね。
インスタンスにはnameだけ設定されていることが確認できました。

プロパティが簡単に書けるようになって、便利ですね。

コメント

タイトルとURLをコピーしました