本記事を書こうと思った動機
本記事では、
-
nullable な型(データ型の前に
?
を付与) -
union 型(
|
で複数のデータ型を結合)
について紹介する。
ある時、有名なライブラリのコードを解析していて、上記 2 つを使用した部分をよく見かけた。私のように「ライブラリを提供する側ではなく、使用する側」の立場が多い人にとっては、使う場面が少なく新鮮なコードに見えた。この機会を逃したら、おそらく勉強しないだろうと思ったので、その意味をはっきりさせておきたかった。
nullable な型
引数や戻り値の型宣言で、nullable 指定ができる。PHP マニュアルによると、
PHP 7.0.x から PHP 7.1.x への移行
時の新機能のようだ。データ型の前にクエスチョンマーク (?
) を付与することで、指定したデータ型に加え、null も渡せるようになる。下記に、引数に (?
) を付与しない場合、付与する場合、戻り値に (?
) を付与する場合を示す。
引数に (?
) を付与しない場合
引数に null を渡すことによるエラーが発生。setName()
はその名の通り、「名前」を設定するだけの関数。
<?php
function setName(String $name) {
var_dump($name);
}
setName(null);
/* 実行結果:
PHP Fatal error: Uncaught TypeError: setName(): Argument #1 ($name) must be of type string, null given
*/
引数に (?
) を付与する場合
null を許容し、プログラムは正常終了。
<?php
function setName(?String $name) {
var_dump($name);
}
setName('佐藤');
setName(null);
/* 実行結果:
string(6) "佐藤"
NULL
*/
戻り値に (?
) を付与する場合
function setName(String $name): ?String {
union 型
バージョン 8.0.0 より、union 型のサポートが追加されたようだ。パイプ (|
) を使用することで、複数の型を許容する引数や戻り値 などを定義できる。下記に、引数に (|
) を使用しない場合、使用する場合、戻り値に (|
) を使用する場合を示す。
引数に (|
) を使用しない場合
float
に文字列を渡すことによるエラーが発生。setTax()
はその名の通り、「消費税率」を設定するだけの関数。
<?php
function setTax(float $tax) {
var_dump($tax);
}
setTax('佐藤');
/* 実行結果:
PHP Fatal error: Uncaught TypeError: setTax(): Argument #1 ($tax) must be of type float, string given
*/
引数に (|
) を使用する場合
複数のデータ型を許容し、プログラムは正常終了。
<?php
function setTax(String|float $tax) {
var_dump($tax);
}
setTax('佐藤');
setTax(1.1);
/* 実行結果:
string(6) "佐藤"
float(1.1)
*/
戻り値に (|
) を使用する場合
function setTax(String $tax): String|float {
最後に
union 型のところで、引数や戻り値 「など」 と書きましたが、どうやらクラスの メンバ変数 にも使えるようだ。使う機会があったら、ぜひ試してみたいと思います。