LoginSignup
0
0

PHP nullable な型、union 型について

Posted at

本記事を書こうと思った動機

本記事では、

  • 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 型のところで、引数や戻り値 「など」 と書きましたが、どうやらクラスの メンバ変数 にも使えるようだ。使う機会があったら、ぜひ試してみたいと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0