💨

今週の PHP 2023-10-21 〜 2023-10-27

2023/11/01に公開

PHP のメーリングリストから、気になった情報をピックアップします。

Internal

リリース

PHP 8.1.25 ChangeLog

PHP 8.2.12 ChangeLog

PHP 8.3.0RC5 https://downloads.php.net/~jakub/

PHP: rfc:process_object_name

PHP 8.0 以降で、あいまいなオブジェクトに変換されるようになった Resource について、どんな名前にしようかというRFCです。3つ候補があるけど、全部リジェクトされてますね。

確かに、あのResourceって何なんだろうなと思っていたので、明確化されるのは良いと思います。

PHP: rfc:change_the_edge_case_of_round

round() 関数のエッジケースについてのRFC

例えば、0.285 は内部的には 0.28499999999999998 だから、切り下げられるべきだけど、現在は切り上げられているよねという話です。

なので、このRFCが採択されると var_dump(round(0.285, 2));float(0.28) になります。

RFCだけ読んでると、ただのBC Break に見えてしまうのですが Fix GH-12143: Optimize round by SakiTakamachi · Pull Request #12268 · php/php-src を読んでみると、もう少し根深い問題であることがわかります。他の言語で足並みを揃えるのかどうなのかみたいな話になると、PHPウェイを貫いていくような気もする...

多分、RFC内の HALD_DOWN は HALF_DOWN なのかな。

OOM error messages - Externals

読んだ瞬間に「わかる〜」って思った話です。Out Of Memoryのエラーに表示される超過したメモリーのサイズが実際よりも過小に表示されるというやつです。

Fix the attempted allocation size in OOM error messages by TimWolla · Pull Request #11763 · php/php-src

PRにはPoCも書いてあるので気になる人は試してみましょう。

計算がおかしいというよりは、エラーのメッセージを更に明確化したら良いのではという議論がPR側でされています。

Basic Type Alias - Externals

PHPに型エイリアスを導入するRFCについての相談スレッドです。以前にも見かけた気がするので、ちょいちょい話にあがるやつではあります。

サンプルに上がっているのはこんな型エイリアスの提案です。

type MyType = string;
// or
typealias MyType = string;

// Advance
type MyType = string|null;
// or
type MyType = [string, null];

以前に見かけた議論だと、ファイル単体では問題ないけど、ファイルまたぎやOPCacheやPreloadされた場合にどうやって名前解決するのかみたいな問題があって、立ち消えていた気がします。

要するに型の解決を行うためのコードをそこら中に追加する必要があるので辛いという話ですね。

議論の中には、肯定も否定も両方あるのですが、ガーフィールドさんのおっしゃるように

独立した変数には、型がありません

というのが、一番の問題になっている気がします。仮に UserId というエイリアスを作ったとしても UserId として変数を定義することが出来ないという。

Constructor promoted property and default value - Externals

Constructor Property Promotion についての質問です。

動作する例 https://3v4l.org/c3JHc

動作しない例 https://3v4l.org/5WtJa

Constructor Property Promotion を使ったクラスを継承すると、親クラス側の変数にアクセスする際に初期化されていないので触ることができないというエラーがでます。

なんとなく、親側のコンストラクターは実行されていないから、$prop が存在していないということなんだろうなと思いますが、たしかにわかりにくいかもしれません。Constructor Property Promotion を使っているんだから、そのPropertyは存在しているんだろ?という感覚も理解できます。

コメントにかかれている対処法の一つは https://3v4l.org/LSIXv のように、親クラスのコンストラクタを明示的に呼ぶことです。まあ、分かる...という感じ。

コメント内には、serialize, unserialize でもコンストラクタは使われるけど、もっと分かりづらいぜみたいな議論もされていて、この辺は理路整然として理解というのが難しいですね。

Discussion