PHP8.4の追加・削除機能の概要を紹介

PHP PHP
主にPHPに関する記事

PHP8.4のリリースが近づいてきています。リリース日と主だった機能や廃止機能を調べてみたので紹介をしていきます。
お使いのPHPをバージョンアップしたり、新しい機能を使ってみたいので知りたいという場合に参考にしてみて下さい。

PHP8.4のリリースについて

リリース日とサポート期間

一般提供リリースは現段階では2024/11/21に予定されています。

サポートの期限は、リリース日の2年後の12/31までバグフィックスとセキュリティ対応、更に2年後の12/31までセキュリティ対応となります。

PHP8.4のバグフィックス対応は2026/12/31まで。
PHP8.4のセキュリティ対応は2028/12/31まで。

リリース日のタイムライン

以下のようなタイムラインとなっています。

日付マイルストーン
2024年7月4日アルファリリース 1
2024年7月18日アルファリリース 2
2024年8月1日アルファリリース 3 (スキップ)
2024年8月1日アルファリリース 4
2024年8月13日機能凍結
2024年8月15日ベータリリース 1 (スキップ)
2024年8月15日ベータリリース 2 (スキップ)
2024年8月15日ベータリリース 3
2024年8月29日ベータリリース 4
2024年9月12日ベータリリース 5
2024年9月26日リリース候補 1
2024年10月10日リリース候補 2
2024年10月24日リリース候補 3
2024年11月7日リリース候補 4
2024年11月21日一般提供リリース

PHP8.4の機能

PHP8.4にて追加や修正される機能や、非推奨や廃止になる機能を紹介します。

プロパティフック

クラスのプロパティのセッター/ゲッターを直接記述することができます。
今までは__set()や__get()マジックメソッドの定型文を記述している事がありましたが、短縮できそうです。

class User implements Named 
{ 
    private bool $isModified = false; 
 
    public function __construct(private string $first, private string $last) {} 
 
    public string $fullName { 
        // Getter 
        get => $this->first . " " . $this->last; 
 
        // Setter 
        set {  
            [$this->first, $this->last] = explode(' ', $value, 2); 
            $this->isModified = true; 
        } 
    } 
} 

非対称可視性

外部からは読み込みをさせたいが、書き込みは内部のみという定義ができるようになります。
__set()や__get()を使う理由は、ほぼほぼ上記の理由なので、非対称可視性をよく利用するようになると思います。

class Foo {
    public private(set) string $bar = 'baz';
    public protected(set) string $hoge = 'fuga';
}

新しい配列検索関数

配列内に値があるかどうかをより簡潔に判断することを目的とした、新しい配列の関数も導入されています。
array_filterによく似ていますが、array_find系は条件に合致する最初の値/キーを返し、array_anyarray_allは要素1つでも/要素全部が条件に合致するかどうかを真偽値で返します。

  • array_find 
  • array_find_key 
  • array_any 
  • array_all 

new MyClass()->method()の括弧なし

// PHP8.3以前
$yesterday = (new Carbon('2024-10-10'))->subDay();

// PHP8.4
$yesterday = new Carbon('2024-10-10')->subDay();

上記例の通り、インスタンス化からメソッドを直接呼び出せなく、カッコが必要でしたが、不要になりました。

JIT(Just-in-Time compiler)の変更

JITフレームワークを作り直したため、JITが更に早くなるそうです。

HTML5のサポート

PHP8.3まではHTML 4.01の機能しかサポートしていませんでした。
libxmlがDOMパーサーとして利用されているのですが、これがHTML5に対応していないためでした。
PHP8.4になり、HTML5がサポートしているLexborを利用することにより対応するようになりました。
互換性のため\DOM\HTMLDocumentを新たに作成するようにしたようです。

その他

PHP8.4の廃止機能

暗黙的なnullを禁止

関数の型を指定した引数のデフォルトnullを禁止します。
以下の例のように、int型なのにnullが入るのはおかしいという事だそうです。

class Foo {
    public function bar(int $x = null, float $y) {
        // ...
    }
}

以下のように修正をすれば良いみたいです。

class Foo {
    public function bar(?int $x, float $y) {
        // ...
    }
}

GET/POSTセッションの廃止

通常セッションのトークンIDはCookieまたはGETまたはPOSTパラメータ経由で受けます。
現在ではCookieでやりとりする事が一般的ですが、以前は全てのブラウザが対応しているわけではなかったという歴史的な経緯があるため、GETやPOSTのパラメータ経由も対応していました。
PHP8.4ではphp.iniのデフォルト設定から変更した際に警告が出るようになっています。更にPHP9では廃止の予定となっています。

その他

上記は代表的なものを紹介しており、これら以外にも大量の廃止機能があります。
こちらにリストがありますので、確認してみて下さい。

終わりに

プロパティフックと非対称可視性がいちばんの目玉ですね。
そして、暗黙的なnullの禁止あたりがバージョンアップで修正が必要そうですね。
既にRC1がダウンロードできるため、お手元で確認してみると良いと思います。

コメント

タイトルとURLをコピーしました