PHP8.4のリリースが近づいてきています。リリース日と主だった機能や廃止機能を調べてみたので紹介をしていきます。
お使いのPHPをバージョンアップしたり、新しい機能を使ってみたいので知りたいという場合に参考にしてみて下さい。
PHP8.4のリリースについて
リリース日とサポート期間
サポートの期限は、リリース日の2年後の12/31までバグフィックスとセキュリティ対応、更に2年後の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_any
とarray_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
を新たに作成するようにしたようです。
その他
- $_POSTと$_FILESは追加の HTTPメソッドをサポートするようになりました。
- マルチバイト トリム関数: mb_trim()、mb_ltrim()、mb_rtrim()。
- round() 関数の新しい、より明確な丸めモード。
- ドライバー固有の機能にアクセスできるようにするドライバー固有の PDO サブクラス。
- DOM および XSL のコールバックが改善され、クロージャ、ファーストクラスの呼び出し可能オブジェクト、およびインスタンス メソッドを使用できるようになりました。
- Lazy Object サポートの追加。これは、ゴースト オブジェクト、プロキシなどを生成するための低レベルの機能を提供します。これらは通常、依存性注入コンテナーやオブジェクト ハイドレーションで使用するためにフレームワークや ORM によって使用されます。
- 非推奨の機能をマークするための新しいエンジン属性 #[Deprecated]。
- BCMath、GMP、DOM 拡張機能にいくつかの改善が加えられました。
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がダウンロードできるため、お手元で確認してみると良いと思います。
コメント