PHP8から、or(または)の意味を持つパイプライン(|)を使って、型宣言を複数指定できるようになりました。
union型は複数宣言の型の名称で、'union' という型の記述はできません。
同じように特定の型を表さないmixedとはそこはちがう。
PHPでも型宣言の波が。
PHPは型宣言なしのデータ型の自由度に特長があるプログラミング言語ですが型宣言もできます。
メジャーアップデートされたPHP8では型の厳密化が進み、PHPでも型を意識するプログラミングが必要になってきています。
ただ、関数のパラメータと戻り値、クラスのプロパティだけが型宣言できて、通常の変数ではできません。
型宣言できるところ
// 関数はパラメータと戻り値で型宣言できる。
function test(int $param) : string
{
return $param . '-change';
}
// クラスはプロパティとメソッドのパラメータと戻り値で型宣言できる。
class Test
{
public string $prop = 'initial';
public function set_prop(string $prop) : void
{
$this->prop = $prop;
}
public function get_prop() : string
{
return $this->prop;
}
}
型宣言できない
function test(int $param) : string
{
string $tmp = null; // <--- 型宣言できない
}
string $test = test(1); // <--- 型宣言できない
PHP7.4の型宣言できないエラー
PHP Parse error: syntax error, unexpected '$tmp' (T_VARIABLE) in /home/vagrant/php-test.php on line 35
PHP8.0の型宣言できないエラー
PHP Parse error: syntax error, unexpected variable "$tmp" in /home/vagrant/php-test.php on line 35
PHP公式ドキュメント
型の複数宣言は比較やコメントと同じ仕様
ここから本題ですが、型の複数宣言はパイプライン(|)を使って定義します。
/**
* test
*
* @param int|string $param parameter.
*/
function test(int|string $param)
{
var_dump($param);
}
test(1);
test('initial data');
test([1, 2]);
この記述は比較でも使われるし、PHPDocの@param, @returnでおなじみなので間違えることはないでしょう。
PHPの標準関数では、関数内での処理が失敗するとfalseを返すものが数え切れないほどあるので、戻り値の型が複数あるのは当たり前です。
かといってmixed型にすると型の厳密化ができません。
型の複数宣言は、型の厳密化とPHP特有の型の自由度の中間的なものです。
ちなみにサンプルでは、3番目の配列を指定しているものはエラーになります。
実行結果
int(1)
string(12) "initial data"
PHP Fatal error: Uncaught TypeError: test(): Argument #1 ($param) must be of type string|int, array given, called in /home/vagrant/php-test.php on line 54 and defined in /home/vagrant/php-test.php:47
Stack trace:
#0 /home/vagrant/php-test.php(54): test()
#1 {main}
thrown in /home/vagrant/php-test.php on line 47
この仕様はPHP8.0で追加されたものなので、PHP7系以下では下位互換がありません。
シンタックスエラー(文法エラー)になります。
PHP7.4のエラー
PHP Parse error: syntax error, unexpected '|', expecting variable (T_VARIABLE) in /home/vagrant/php-test.php on line 47
PHP公式ドキュメント