今週の PHP 2023-11-11 〜 2023-11-17
PHP のメーリングリストから、気になった情報をピックアップします。
Internal
PHP: rfc:release_cycle_update
リリースサイクルに変更を入れましょうというRFCです。現段階では
- セキュリティサポートの一年延長
- セキュリティサポート期間における回帰バグの修正対応
- RCやバグフィックス期間における新規フィーチャーの追加禁止
- beta期間におけるRFCを伴わないフィーチャーの許可
- RCを4つまでに制限する
いずれも、現時点の問題点に対してバランスの取れた状態にしたいという要求です。まだまだ細かい議論の詰めがありそうです。
PHP-8.1 closed for bug fixes, security fixes only - Externals
PHP8.1がセキュリティ修正のみの期間に突入しましたよというお知らせ。時が経つのは早いですね。
PHP: rfc:new_rounding_modes_to_round_function
roundに新しいモードを4つ追加しましょうというRFCです。投票が開始されました。
- PHP_ROUND_CEILING - 引数数字より大きい最近接の整数に丸める
- PHP_ROUND_FLOOR - 引数数字より小さい最近接の整数に丸める
- PHP_ROUND_AWAY_FROM_ZERO - 引数数字を0から遠い方向にまるめる
- PHP_ROUND_TOWARD_ZERO - 引数数字を0に向かって丸める
NumberFormatterはすでに同様のモードを持っているということです。そのまま承認されそう。
PHP: rfc:adding_bcround_bcfloor_bcceil_to_bcmath
BCMathに新しい3つの関数を追加しましょうという提案です。投票が開始されています。
- bcround
- bcfloor
- bcceil
現状では可決ムードです。
PHP: rfc:jit_config_defaults
JITを無効化する設定がわかりにくいから改善しようというRFC
現状
opcache.jit=tracing
opcache.jit_buffer_size=0
提案
opcache.jit=disable
opcache.jit_buffer_size=64m
確かにわかりやすい。現在、詳細を議論中です。
PHP: rfc:final_anonymous_classes
無名クラスをfinalで宣言できるようにする、または無名クラスは全部finalにするというRFCです。
前者の対応であれば追加仕様になり、後者の場合はど派手にBC Breakになります。
クラスの保護以外の理由として、JITの効率が良くなるという効果があるようです。
今来ているコメントとしては、無名クラスに対するBC Breakが発生する上に、パフォーマンス上の効果は限定的なので、全ての無名クラスがデフォルトでfinalになる提案は好まないというものです。
私もテストなどで、無名クラスをモックのように使うことが多いので、デフォルトでfinalになってしまうと壊れるテストがいっぱいあるなぁなどと思ってしまいました。
PHP: rfc:mixed_vs_untyped_properties
型付きと型付じゃないプロパティの調和というRFCです。
型未指定と mixed
という型を明確に分けて考えているようですが、3回くらい読み直してもよくわかりませんでした。狙いは何なんだろう。
五十嵐さんに教えてもらいました。暗黙的な初期値nullを避けることが出来るようになります。下表の Initial State
の列を見ればわかりやすいです。 mixed
型指定によって、より安全なクラスの利用が可能になるというイメージですね。
2023/11/21 さらに補足。初期状態、unset後の状態に統一感が無いので整理しようというのがRFCのメインパーパスです。
Property Declaration | Initial state | After assignment | After unset | After re-assignment |
---|---|---|---|---|
#[AllowDynamicProperties] | Undefined | Defined, public | Undefined | Defined, public |
private $foo; | null | Defined, private | ? | Defined, private |
private mixed $foo; | Uninitialized | Defined, private | Uninitialized | Defined, private |
Array functions with strict comparison - Externals
array_diff
array_intersect
などで、配列同士の比較が厳密ではないというお便りでしたが、正しくは配列内の値をstringキャストした上で厳密比較をしているようです。
falseの文字列キャストは空文字なので、最初の array_diff
はdiff無しとなっています。
でもって、仕様はそうなっているわけだからコレ以上の議論は不要で、変更したい場合はRFCのプロセスになるねという流れです。
なんか、前にもこんな話があったような....
Discussion