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"
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公式ドキュメント
下位互換はない。
この機能はシンタックス(文法)に関するものなので、PHP7系以下では動作しません。
PHP Parse error: syntax error, unexpected 'public' (T_PUBLIC), expecting variable (T_VARIABLE) in /home/vagrant/php-test.php on line 5
文法エラーなので、クラスのインスタンス作成時にエラーになるのではなく、クラス定義そのものでエラーになります。
PHP公式ドキュメント