PHP8がベータ版に

 



2020/8/20

先日PHPのバージョン8がベータ版で公開されたアナウンスがあり、リリースが近づいてきたので一部の新機能を紹介したいと思います。

match文

switch文に似たmatch文が追加されます。

例えば、これまでのswitch文はこのような感じでした。

$signal;

switch ($color) {
    case '青':
        $signal = '進め';
        break;

    case '黄':
        $signal = '注意';
        break;

    case '赤':
        $signal = '止まれ';
        break;

    default:
        $signal = '停電';
        break;
}

これをmatch文にすると以下のようになります。

$signal = match ($color) {
    '青' => '進め',
    '黄' => '注意',
    '赤' => '止まれ',
    default => '停電',
};

だいぶ行数を削減できますね。

共用の型定義が可能に(Union Types)

型の定義(タイプヒンティング)はこれまで、以下のように1つのものしか指定できませんでした。

class Number {
    /**
     * これまでは、このように仕方なくコメントで複数の型を指示していました
     * @param int|float $number
     * @return int|float $number
     */
    public function setNumber($number)
    {
        $this->number = $number;
        return $this->number;
    }
}

これが以下のように指定できるようになる予定です。やっと・・・という感じですね。

class Number {
    /**
     * このように指定できるようになります
     * @param int|float $number
     */
    public function setNumber(int|float $number): int|float
    {
        $this->number = $number;
        return $this->number;
    }
}

返り値の型定義に「static」の指定が可能に

これはいままでなかったのが不思議ですね。

class Foo {
    public function bar($arg): static
    {
        return new static($arg);
    }
}

Null安全演算子(Nullsafe operator)

これまでは、いちいちif文で分岐する必要がありました。

$country =  null;
 
if ($session !== null) {
    $user = $session->user;
 
    if ($user !== null) {
        $address = $user->getAddress();
 
        if ($address !== null) {
            $country = $address->country;
        }
    }
}

以下のようにシンプルに書けるようになる予定です。これはすごいですね。
メソッドの存在有無もチェックしてくれるのかは不明です。

$country = $session?->user?->getAddress()?->country;

名前付き引数

もう引数の順番を気にする必要がなくなります。
これまで、引数は以下のように順番通りに指定する必要がありました。

array_fill(0, 100, 50);

名前付き引数では以下のように書けます。

// 名前を付けて指定
array_fill(start_index: 0, num: 100, value: 50);
// 名前があるので順番がバラバラでも可
array_fill(value: 50, num: 100, start_index: 0);

// あいだの引数を飛ばして書ける
htmlspecialchars($string, double_encode: false);
// 上記は以下と同じ意味
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);

引数の内容も分かりやすくなって良いですね。

独自関数の場合は定義時の変数名が名前になるようです。
次章のコンストラクタのプロパティ定義と組み合わせることもできます。

コンストラクタのプロパティ昇格

クラスのコンストラクタの引数をプロパティに昇格できる構文です。
言葉ではわかりにくいため例で示します。

これまでは以下のようにクラスを定義していました。
何度も同じプロパティ名を書く必要があり煩わしいですね。

class Foo {
    public string $a;
    public float $b;
 
    public function __construct(
        string $a = 'bar',
        float $b = 0.2,
    )
    {
        $this->a = $a;
        $this->b = $b;
    }
}

これが以下のように、コンストラクタでいきなりプロパティ定義&代入できるようになります。

class Foo {
    public function __construct(
        public string $a = 'bar',
        public float $b = 0.2,
    ) {}
}

これも非常に助かりますね。


リリースサイクルによると、PHP8は今年2020年11月26日に正式リリースを予定しているようです。

ほかにもいくつか便利機能が追加されるようですが、また正式リリースになったら紹介したいと思います。