PHP 8.0とは——メジャーバージョンアップの意義
PHP 8.0は2020年11月にリリースされた、PHPにとって数年ぶりの大規模なメジャーアップデートです。単なる機能追加にとどまらず、言語の型システム・パフォーマンス・表現力が根本的に強化されました。
JITコンパイラ(Just-In-Time Compiler)
PHP 8.0の目玉機能がJITコンパイラです。従来のPHPはリクエストのたびにPHPコードをオペコードに変換して実行するインタプリタ方式でしたが、JITではホットスポット(繰り返し実行されるコード)をネイティブのマシンコードにコンパイルしてキャッシュします。
JITが効果を発揮するのは主にCPUバウンドな処理です。数値計算・行列演算・画像処理などでは10〜15%程度の改善が見られます。一方、I/Oバウンドな処理(データベースアクセス・HTTP通信)が中心のWebアプリでは劇的な改善は期待しにくいです。
; php.ini設定例
opcache.enable=1
opcache.jit_buffer_size=100M
opcache.jit=tracing
名前付き引数(Named Arguments)
関数・メソッドの引数を名前で指定できるようになりました。引数の順序を気にする必要がなく、デフォルト値を持つ引数を飛ばして指定することも可能です。
// PHP 7.x 以前:位置引数のみ
array_slice($array, 1, null, true);
// PHP 8.0:名前付き引数
array_slice(array: $array, offset: 1, preserve_keys: true);
// 組み込み関数でも有効
$safe = htmlspecialchars(
string: $userInput,
encoding: 'UTF-8',
double_encode: false
);
コントローラーのメソッド呼び出しでも使えます。
$result = collect($items)->sortBy(
callback: fn($item) => $item['price'],
descending: true
);
マッチ式(Match Expression)
switch 文の進化版として登場した match 式は、値を返すことができ、厳密比較を行い、フォールスルーがありません。
// switch:フォールスルーに注意・緩い比較
switch ($status) {
case '1': // '1' == 1 で一致してしまう
echo '公開';
break;
default:
echo '不明';
}
// match:厳密比較・値を返す・フォールスルーなし
$label = match($status) {
1 => '公開',
2 => '下書き',
3 => '予約投稿',
default => '不明',
};
// 複数条件をまとめる
$type = match(true) {
$price >= 10000 => 'premium',
$price >= 5000 => 'standard',
$price >= 1000 => 'basic',
default => 'free',
};
Nullセーフ演算子(?->)
ネストしたオブジェクトへのアクセス時に、途中でnullが返った場合でもエラーを起こさずにnullを返す演算子です。
// 従来のnullチェック地獄
$city = null;
if ($user !== null) {
$address = $user->getAddress();
if ($address !== null) {
$city = $address->getCity();
}
}
// PHP 8.0:nullセーフ演算子
$city = $user?->getAddress()?->getCity();
// LaravelのリレーションやEloquentとも相性抜群
$avatarUrl = $user?->profile?->avatar?->getUrl() ?? '/images/default-avatar.png';
Union型(複数の型を許容)
function processId(int|string $id): int|false
{
if (is_string($id)) {
$id = (int) ltrim($id, '#');
}
return $id > 0 ? $id : false;
}
Constructor Property Promotion(コンストラクタプロパティ昇格)
コンストラクタの引数に public・protected・private をつけるだけで、プロパティの宣言・代入が同時に行えます。
// PHP 7.x 以前
class User {
public string $name;
public string $email;
public function __construct(string $name, string $email) {
$this->name = $name;
$this->email = $email;
}
}
// PHP 8.0:コンストラクタプロパティ昇格
class User {
public function __construct(
public readonly string $name,
public readonly string $email,
) {}
}
弊社ではDTOクラス・FormRequestの内部表現・ValueObjectなど、様々な場面でコンストラクタプロパティ昇格を活用しています。
str_contains・str_starts_with・str_ends_with
これまで strpos() !== false などで書いていた文字列チェックが、読みやすい関数で書けるようになりました。
// PHP 7.x 以前
if (strpos($url, 'https') === 0) { ... }
// PHP 8.0
if (str_starts_with($url, 'https')) { ... }
if (str_ends_with($filename, '.php')) { ... }
if (str_contains($message, '重要')) { ... }
まとめ
PHP 8.0の新機能は、コードの安全性・可読性・パフォーマンスを同時に向上させるものばかりです。弊社ではPHP 8.2を採用しており、JIT・名前付き引数・マッチ式・nullセーフ演算子をLaravelプロジェクトで日常的に活用しています。
PHP 8系を使ったシステム開発・リプレースのご相談は、お気軽にお問い合わせください。