はじめに
今更ですが、PHP8.0の新機能をいくつか試してみました。
試してみた新機能は以下です。
- 関数の名前付き引数
- union型
- match式
- nullsafe演算子
それでは早速使用例や詳細を書いていきたいと思います。
目次
1. 関数の名前付き引数
2. union型
3. match式
4. nullsafe演算子
5. おわりに
1. 関数の名前付き引数
関数を実行する際に引数を名前で指定できます。
任意の順番で引数を渡せるため、デフォルト値をもつ引数をスキップできます。
<?php
function foo($a = 0, $b = 0, $c = 0) {
return $a + ($b * 2) + ($c * 3);
}
// $c以外はデフォルト値を使用したい
echo foo(0, 0, 10); // 位置指定の場合
echo foo(c: 10); // 名前付き引数の場合
名前付き引数の場合、$c
にだけ値を渡せるので楽ちんです。
2. union型
複数の型をor
条件で指定できるunion型が追加されています。
null
を受け入れるような場合などに使用できそうです。
<?php
function foo($val): int {
return $val;
}
echo foo (1);
echo foo (null);
null
を許容していないため、返却する値がnull
だとエラーが発生してしまいます。
<?php
function foo($val): int|null {
return $val;
}
echo foo (1);
echo foo (null);
こちらはunion型でnull
も許容しているためエラーが発生しません。
3. match式
match式は値をチェックした結果によって実行される処理が決まります。
switch文のような感じで使えますが、switch文とは違い型のチェックまで行います。
$foo
の値とマッチする条件式があるかチェックします。
<?php
$foo = 'qux';
$result = match($foo) {
'bar' => 'barです。',
'baz','qux' => 'bazかquxです。' // 条件式を複数書くこともできる
};
echo $result;
この場合2つ目の条件式とマッチするのでbazかquxです。
が返されます。
また、条件式を複数設定したり、返却式で関数を実行することもできます。
3.1 デフォルトパターンを設定
全ての条件式にマッチしなかった場合エラーが発生しますので、エラーを発生させたくない場合はデフォルトパターンを設定します。
<?php
$foo = '';
$result = match($foo) {
'bar' => 'barです。',
'baz' => 'bazです。'
};
echo $result;
チェックした値がどの条件式にもマッチしていないためエラーが発生してしまいます。
<?php
$foo = '';
$result = match($foo) {
'bar' => 'barです。',
'baz' => 'bazです。',
default => 'デフォルトパターンです。'
};
echo $result;
// デフォルトパターンです。
どの条件式にもマッチしない場合、デフォルトパターンの返却式が実行されます。
3.2 厳密な一致チェックを行わずに match 式を使う
制約式にtrue
を指定すると条件式に比較演算子などを使用することができます。
<?php
$num = 10;
$return_value = match (true) { // 制約式をtrueに
$num > 5 => '$numは6以上の数字です。',
$num <= 5 => '$numは5以下の数字です。'
};
echo $return_value;
$numは6以上の数字です。
が返されます。
4. nullsafe演算子
オブジェクトにアクセスする際にそのオブジェクトがnull
だとエラーが発生しますが、nullsafe
演算子を使用するとエラーが発生せずnull
が返却されるだけになります。
<?php
$obj = null;
$foo = $obj->foo;
var_dump($foo);
// エラーが発生する
// Warning: Attempt to read property "foo" on null in /home/user/scripts/code.php on line 3
$obj
がnull
だとエラーが発生する
<?php
$obj = null;
$foo = $obj?->foo;
var_dump($foo);
nullsafe演算子?->
を使用すると$obj
がnull
でもエラーは発生しない
下記のようにis_null
でオブジェクトをチェックするよりシンプルに書けます。
<?php
$obj = null;
if (is_null($obj)) {
$foo = null;
} else {
$foo = $obj->foo;
}
var_dump($foo);
5. おわりに
記事を見ていただきありがとうございました。
新機能は他にもありますので興味あれば確認してみてください。
PHP8.0
参考