💡

今週の PHP 2023-11-11 〜 2023-11-17

2023/11/21に公開

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回くらい読み直してもよくわかりませんでした。狙いは何なんだろう。

https://x.com/sji_ch/status/1726620525940838910?s=20

五十嵐さんに教えてもらいました。暗黙的な初期値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キャストした上で厳密比較をしているようです。

https://3v4l.org/lvdJ4

falseの文字列キャストは空文字なので、最初の array_diff はdiff無しとなっています。

でもって、仕様はそうなっているわけだからコレ以上の議論は不要で、変更したい場合はRFCのプロセスになるねという流れです。

なんか、前にもこんな話があったような....

Discussion