株式会社WR

株式会社WR

WEB TOTAL CONSULTING

PHP 8.0の新機能まとめ——JITコンパイラ・名前付き引数・マッチ式
ブログ一覧へ
技術ブログ

PHP 8.0の新機能まとめ——JITコンパイラ・名前付き引数・マッチ式

PHP 8.0でJITコンパイラ・名前付き引数・マッチ式・nullセーフ演算子など多くの機能が追加されました。本記事では実務で役立つ主要な新機能を解説します。

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(コンストラクタプロパティ昇格)

コンストラクタの引数に publicprotectedprivate をつけるだけで、プロパティの宣言・代入が同時に行えます。

// 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系を使ったシステム開発・リプレースのご相談は、お気軽にお問い合わせください。

Category 技術ブログ

Related Posts

関連記事

開発・技術のご相談はお気軽に

お見積りは無料です。まずはお気軽にご相談ください。

お問い合わせ →