LoginSignup
6
3

More than 1 year has passed since last update.

PHP8.0の新機能を試してみた

Last updated at Posted at 2022-10-21

はじめに

今更ですが、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

$objnullだとエラーが発生する

<?php
$obj = null;
$foo = $obj?->foo;
var_dump($foo);

nullsafe演算子?->を使用すると$objnullでもエラーは発生しない

下記のようにis_nullでオブジェクトをチェックするよりシンプルに書けます。

<?php
$obj = null;
if (is_null($obj)) {
	$foo = null;
} else {
	$foo = $obj->foo;
}
var_dump($foo);

5. おわりに

記事を見ていただきありがとうございました。
新機能は他にもありますので興味あれば確認してみてください。
PHP8.0

参考

6
3
1

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
6
3