PHP8では、パラメータの最後にカンマ(,)が付けられるようになりました。
でも、この記法の導入はおすすめしません。PHP7.4以下では文法エラー(Syntax error)になって致命的だから。
最後のカンマを付けない従来の記法でも通じるので、あえて使う理由はありません。
言葉でつらつらと書くよりもコードを見れば百聞は一見にしかずです。
<?php
function test($a, $b, $c,) // 最後にカンマが付けられる。
{
echo 'function end' . PHP_EOL ;
}
test(1, 2, 3, ); // 最後にカンマが付けられる。
php80の実行結果
function end
当然ですが、この記法はPHP7以前はシンタックスエラー(Syntax error)です。
php74の実行結果
PHP Parse error: syntax error, unexpected ')', expecting variable (T_VARIABLE) in /home/vagrant/php-test.php on line 3
PHP公式ドキュメント
この文法の変更は、クラスのメソッド、無名関数の変数の引き継ぎで使うuseのパラメータでも同じ。
もちろん、PHP7以前はシンタックスエラーになります。
class Test
{
private $a;
private $b;
public function __construct($a, $b,)// 最後にカンマが付けられる
{
$this->a = $a;
$this->b = $b;
echo 'new instance!' . PHP_EOL;
// 無名関数
$anonymous = function () use ($a, $b,) { // 最後にカンマが付けられる
echo 'anonymous end' . PHP_EOL;
};
$anonymous();
}
}
$test = new Test(1, 2,); // 最後にカンマが付けられる
php80の実行結果
new instance!
anonymous end
PHP CodeSniffer などの静的コードチェックツールは微妙
最近のプログラミングではPHP CodeSnifferなどを使って、プログラミングしながら文法エラーなどのチェックも同時にしていると思います。
しかし、今回の文法変更の対応は微妙です。
関数やメソッドの定義では問題ないですが、関数コール、インスタンス作成、メソッドコール時はエラーが出ます。
test(1, 2, 3,);
コーディングチェックエラー
No space found after comma in argument list
test(1, 2, 3, );
コーディングチェックエラー
Expected 0 spaces before closing parenthesis; 1 found
スペースが無いというから直したのに、今度は1個のスペースが余計だと言われます。
これはデフォルト設定の場合。カスタマイズすれば対応できますが、関数コールで最後にカンマが付くと体のどこかが痒くなる気持ち悪さがある。
個人的にはデフォルト設定でいいと思う。
PHP公式ドキュメント