[PHP] 使えるようになった機能

PHPのバージョンが進むにつれて機能も増えていきました。
どのバージョンにどんな機能が追加されたのか、わからなくなってしまうので、個人的に気になった機能が利用できるようになったバージョンをまとめました。

PHP 5.6

定数式

いろいろ語弊がありますが、定数やプロパティの宣言、関数のデフォルト引数などで計算を行えるようになりました。

PHP
const ONE = 1;
const TWO = ONE * 2;

… による可変長引数関数

可変長引数の関数で、引数を取得するには func_get_args で取得する必要がありましたが、...演算子で取得できるようになりました。

PHP
function f($req, $opt = null, ...$params) {
    // $params は配列で、残りのすべての引数が含まれます
    printf('$req: %d; $opt: %d; パラメータ数: %d', $req, $opt, count($params));
}

f(1, 2, 3, 4, 5); // '$req: 1; $opt: 2; パラメータ数: 3'

累乗演算子 **

累乗計算を行う演算子です。

PHP
$a = 2 ** 3; // $a = 8

PHP 7.0

Null 合体演算子

ハテナ2つで記述する演算子です。issetなどで null かどうかをチェックしたものが簡単に書けるようになります。

PHP
// 下の2つが同じ意味になります
$username = $_GET['user'] ?? 'nobody';
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

PHP 7.1

nullable な型

型の前にハテナをつけるとnullableになります。指定の型もしくはnullが許容されます。

PHP
function a(?string $name): ?string
{
    // ...
}

void 関数

戻り値の型をvoidとすることで、値を返さない関数として宣言できます。
returnを記述しないか、空のreturnが使えます。

PHP
function a($name): void
{
    if ($name === null || $name === '') {
        return;
    }

    echo $name;
}

PHP 7.3

ヒアドキュメントと Nowdoc構文のインデント

ヒアドキュメントと Nowdoc構文の終端にインデントが使えるようになりました。
インデントがついている場合、文字列からもインデントが取り除かれます。

PHP
function a()
{
    echo <<<END
    abc
    def
    END;
}

実行結果は下記のようになります。
END;のインデント分のスペースが削除されます。

HTML
abc
def

PHP 7.4

アロー関数

無名関数が簡単に書けるようになります。親のスコープで使える変数が使えるのでuseが不要になります。

PHP
$y = 1;
 
// $fn1と$fn2は同じ意味
$fn1 = fn($x) => $x + $y;

$fn2 = function ($x) use ($y) {
    return $x + $y;
};

Null 合体代入演算子

代入先の変数がnullの場合に、右辺の値が代入される演算子です。
変数に値が代入されていないときにデフォルト値を代入するのに利用できます。

PHP
// 下の2つが同じ意味になります
$username ??= 'nobody';

if (!isset($username)) {
    $username = 'nobody';
}

PHP 8.0

match

switchに似ていますが、matchは値を返します。
比較は型と値の一致(===)での比較となります。

PHP
$food = 'cake';

$return_value = match ($food) {
    'apple' => 'This food is an apple',
    'bar' => 'This food is a bar',
    'cake' => 'This food is a cake',
};

$return_value; // 'This food is a cake'

このほか、いろいろな活用方法がありますので、公式を確認してください。

nullsafe 演算子(?->)

アロー演算子(->)でつないだ時に、途中にnullがあったときにエラーとなりますが、nullsafe 演算子を使うことでnullが買えるようになります。

PHP
// 下の2つが同じ意味になります
$result = $repository?->getUser(5)?->name;

if (is_null($repository)) {
    $result = null;
} else {
    $user = $repository->getUser(5);
    if (is_null($user)) {
        $result = null;
    } else {
        $result = $user->name;
    }
}

文字列と数値の比較

数値と非数値文字列を比較する場合、数値を文字列にキャストし、文字列と比較するようになりました。
PHP 8.0よりも前は、数値に変換してから比較をしていました。
これにより、'foo' == 0がfalseと判定されるようになりました。

PHP
// 下記の例はPHP8.0以降falseと判定されます
// PHP8.0以前はtrueと判定されていました
'foo' == 0;
'' == 0;
'12abc' == 12;

PHP 8.1

Enum(列挙型)

値を限定した型を定義できます。
ようやく、PHPでも公式にサポートされました。

PHP
enum Suit
{
    case Hearts;
    case Diamonds;
    case Clubs;
    case Spades;
}