ツイート
シェア
LINEで送る
B! はてぶでブックマーク
Pocketでブックマーク
RSSフィード

PHP8, コンストラクタのパラメータをクラスのプロパティに変身させる。

php
イラストダウンロードサイト【イラストAC】
の画像をもとに加工しています。

PHP8から、コンストラクタのパラメータ変数をクラスのプロパティにするシンタックス(文法)が追加されました。

これで、コンストラクタ内で '$this->〇〇 = 〇〇' というパラメータをプロパティに代入する処理が不要になります。

プログラミング記述省略のシンタックス変更のひとつ。

パラメータに変数のスコープを付けるだけでプロパティになる。

コンストラクタのパラメータをクラスのプロパティにする方法は簡単です。

public, private, protected のいずれかを使って変数にスコープを与えてやればいい。

<?php

class Test
{
    public function __construct(public string $prop){}
}

$test = new Test('initial value');
var_dump($test->prop);
実行結果
string(13) "initial value"
PHP7の記述
class Test
{
    public string $prop;

    public function __construct(string $prop){
        $this->prop = $prop;
    }
}

これ、かなり楽です。コンストラクタでは初期処理を書くのが通例で、プロパティの初期化処理だけになってしまうことも多いです。

それをパラメータ定義で済ませてしまうのはスッキリしていて良い。

もちろん、通常のパラメータでもあるので、'=' を使ってデフォルト値を指定することも可能。

class Test
{
    public function __construct(public string $prop = 'initial value'){}
}

$test = new Test();
var_dump($test->prop);
実行結果
string(13) "initial value"

ちなみに変数の型は無くてもよいですが、PHP8はデータ型の厳密化の仕様変更がかなり行われています。

データ型は明示しようというメッセージが大きく出ているようなものなので、この際、曖昧なデータ型のプログラミングはやめにしましょう。

コンストラクタ以外のメソッドではできない。

メソッドのパラメータをクラスのプロパティにできるのはコンストラクタだけです。

たとえば、セッターメソッドでやろうとすると、シンタックスエラー(文法エラー)になる。

class Test
{
    public function set_prop(public string $prop){}
}
PHP Fatal error:  Cannot declare promoted property outside a constructor in /home/vagrant/php-test.php on line 36

コンストラクタのパラメータをプロパティとしても使うことを『コンストラクタのプロモーション』と表現します。

staticなプロパティはプロモートできない。

さらに、静的(static)なプロパティはプロモートできません。

class Test
{
    public function __construct(public static string $prop = 'initial value'){}
}
実行結果
PHP Parse error:  syntax error, unexpected token "static", expecting variable in /home/vagrant/php-test.php on line 43

これをエラーにする意味は分かると思います。コンストラクターはインスタンス作成メソッドなのでstaticとは対極にある(動的)もの。

これができてしまうと、ロジックがぐちゃぐちゃになります。

PHP公式ドキュメント

static キーワード

下位互換はない。

この機能はシンタックス(文法)に関するものなので、PHP7系以下では動作しません。

PHP7.4の実行結果
PHP Parse error:  syntax error, unexpected 'public' (T_PUBLIC), expecting variable (T_VARIABLE) in /home/vagrant/php-test.php on line 5

文法エラーなので、クラスのインスタンス作成時にエラーになるのではなく、クラス定義そのものでエラーになります。

前の投稿
PHPは '...' のことをスプレッド演算子とは言っていない。
PHP8, union型, 変数や関数の型を複数宣言できる。
次の投稿

コメントを残す