今回はコンストラクタのプロモーションについてです。
コンストラクタのプロモーションはPHP8.0.0から使用できるようになりました。
従来の記述
class TestClass
{
function __construct(int $x, int $y = 0)
{
$this->x = $x;
$this->y = $y;
}
}
PHP8.0.0以降の記述
class TestClass
{
function __construct(protected int $x, protected int $y = 0)
{
}
}
記述がスッキリして見やすいですね。
PHPマニュアルには以下のように記載されています。
コンストラクタの引数に、アクセス権の修飾子が含まれている場合、 PHP はそれをオブジェクトのプロパティ、かつコンストラクタの引数であると解釈します。 そして、その引数の値をプロパティに代入します。 コンストラクタの本体は空にすることもできますし、 他の文を含めることも出来ます。 引数の値が対応するプロパティに代入された後、 追加の文が実行されます。
全ての引数をプロパティに昇格させる必要はありません。 昇格させる引数と、させない引数を混ぜることもできます。 プロパティに昇格した引数は、コンストラクタの呼び出しコードになんの影響も与えません。
引数にpublic、protected、privateなどのアクセス権修飾子があることで、引数をクラス内変数として解釈してくれます。
また、アクセス権修飾子がなければ従来のように引数として値を渡し何かしらの処理を行う事も可能です。
$x、$yはプロパティとして、$keyは従来通りの引数としてただ渡すとこのようになります。
<?php
class TestClass
{
protected string $year;
protected string $month;
function __construct(protected int $x, protected int $y, int $key)
{
if (preg_match('/^\d{5}$/', $key) === 0) {
throw new Exception('5桁のキーを入力してください');
}
}
function test()
{
$sum = $this->x + $this->y; // $x, $yがプロパティに昇格されているためそのまま使用できる
// $keyは引数として渡されただけなので、$this->keyとするとエラーが発生する
echo "x + y = {$sum}";
}
}
$test_class = new TestClass(1, 2, 12345);
$test_class->test();
?>
実行結果:
x + y = 3
最近のコメント