PHPのバージョンが進むにつれて機能も増えていきました。
どのバージョンにどんな機能が追加されたのか、わからなくなってしまうので、個人的に気になった機能が利用できるようになったバージョンをまとめました。
PHP 5.6
定数式
いろいろ語弊がありますが、定数やプロパティの宣言、関数のデフォルト引数などで計算を行えるようになりました。
const ONE = 1;
const TWO = ONE * 2;
… による可変長引数関数
可変長引数の関数で、引数を取得するには func_get_args
で取得する必要がありましたが、...
演算子で取得できるようになりました。
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'
累乗演算子 **
累乗計算を行う演算子です。
$a = 2 ** 3; // $a = 8
PHP 7.0
Null 合体演算子
ハテナ2つで記述する演算子です。isset
などで null かどうかをチェックしたものが簡単に書けるようになります。
// 下の2つが同じ意味になります
$username = $_GET['user'] ?? 'nobody';
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
PHP 7.1
nullable な型
型の前にハテナをつけるとnullableになります。指定の型もしくはnullが許容されます。
function a(?string $name): ?string
{
// ...
}
void 関数
戻り値の型をvoid
とすることで、値を返さない関数として宣言できます。return
を記述しないか、空のreturn
が使えます。
function a($name): void
{
if ($name === null || $name === '') {
return;
}
echo $name;
}
PHP 7.3
ヒアドキュメントと Nowdoc構文のインデント
ヒアドキュメントと Nowdoc構文の終端にインデントが使えるようになりました。
インデントがついている場合、文字列からもインデントが取り除かれます。
function a()
{
echo <<<END
abc
def
END;
}
実行結果は下記のようになります。END;
のインデント分のスペースが削除されます。
abc
def
PHP 7.4
アロー関数
無名関数が簡単に書けるようになります。親のスコープで使える変数が使えるのでuse
が不要になります。
$y = 1;
// $fn1と$fn2は同じ意味
$fn1 = fn($x) => $x + $y;
$fn2 = function ($x) use ($y) {
return $x + $y;
};
Null 合体代入演算子
代入先の変数がnullの場合に、右辺の値が代入される演算子です。
変数に値が代入されていないときにデフォルト値を代入するのに利用できます。
// 下の2つが同じ意味になります
$username ??= 'nobody';
if (!isset($username)) {
$username = 'nobody';
}
PHP 8.0
match
switch
に似ていますが、matchは値を返します。
比較は型と値の一致(===)での比較となります。
$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が買えるようになります。
// 下の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と判定されるようになりました。
// 下記の例はPHP8.0以降falseと判定されます
// PHP8.0以前はtrueと判定されていました
'foo' == 0;
'' == 0;
'12abc' == 12;
PHP 8.1
Enum(列挙型)
値を限定した型を定義できます。
ようやく、PHPでも公式にサポートされました。
enum Suit
{
case Hearts;
case Diamonds;
case Clubs;
case Spades;
}
[AD]