[PHP] NULL判定を行う演算子

変数の値がNULLの時に初期値を設定するようなコードは、これまでif文でisset関数やempty関数、is_null関数などを使って判定し初期値を代入していましたが、NULL判定用の条件演算子、NULL判定用の代入演算子を使うことで簡潔に記述できるようになりました。

NULL判定を行う条件演算子

構文

変数 ?? 初期値

[実装例]変数のNULL判定

以下の例では、変数$var1、$var2、$var3、$var4に対してNULLの場合に初期値を代入しています。

注意する点としては、対象の変数が未定義の場合($var2)もNULLとして扱われ、空文字($var3)の場合はNULLとして扱われない点です。

コード

$var1 = null;
//$var2
$var3 = "";
$var4 = 1;

$var1 = $var1 ?? 'default';
$var2 = $var2 ?? 'default';
$var3 = $var3 ?? 'default';
$var4 = $var4 ?? 'default';

echo "var1=", $var1, "\n";
echo "var2=", $var2, "\n";
echo "var3=", $var3, "\n";
echo "var4=", $var4, "\n";

実行結果

$ php test_null.php
var1=default
var2=default
var3=
var4=1

NULL判定を行う代入演算子

構文

変数 ??= 初期値

[実装例]変数のNULL判定

代入演算子を使って記述すると、上記のコードをさらに簡潔に記述することが出来ます。実行すると同じ結果になります。

$var1 = null;
//$var2
$var3 = "";
$var4 = 1;

$var1 ??= 'default';
$var2 ??= 'default';
$var3 ??= 'default';
$var4 ??= 'default';

echo "var1=", $var1, "\n";
echo "var2=", $var2, "\n";
echo "var3=", $var3, "\n";
echo "var4=", $var4, "\n";
$ php test_null.php
var1=default
var2=default
var3=
var4=1

nullsafe演算子

nullsafe演算子はPHP8で導入された演算子です。これを使うとクラスのメソッドが意図せずnullを返却したとき、メソッドチェーンで呼び出される後続のメソッドを停止することが出来ます。

nullsafe演算子の構文

nullsafe演算子はメソッド呼び出し時に?を付けて呼び出します。

{インスタンス}?->{メソッド}

[実装例]nullsafe演算子

コード

以下の例では、getInstanceメソッドでクラスのインスタンスを返してほしいところをnullを返しています。しかし呼び出し側ではnullsafe演算子を使って呼び出しているため、特にエラーになることなく実行できます。

class Test {
    public function getInstance() {
        echo __METHOD__, "\n";
        return null;
    }

    public function getValue() {
        echo __METHOD__, "\n";
        return 'value';
    }
}

$test = new Test();
$var = $test?->getInstance()?->getValue();
echo "var = ", $var, "\n";

実行結果

実行結果を確認するとエラーは発生せず、またgetInstanceの結果がnullのためgetValueは呼び出されずに終了していることが分かります。

$ php test_nullsafe.php
Test::getInstance
var =

コメント

このブログの人気の投稿

docker-compose up で proxyconnect tcp: dial tcp: lookup proxy.example.com: no such host

docker-compose で起動したweb、MySQLに接続できない事象

【PHP】PHP_CodeSnifferを使う(コーディングルールのカスタマイズ)