不定期に誰に向けるでもなく PHP に関する雑な殴り書きをしている。日付が変わってから変わる前の日付の奴だと言い張って投稿するくらいの雑さ加減。
Psalm 5.18.0 が降ってきていた
- https://github.com/vimeo/psalm/releases/tag/5.18.0
- PHP 8.3 の
#[Override]
対応が入ってる
オレオレメモリプロファイラで memory_limit 越え時の真のコールスタックを得る実装を書いた
- https://github.com/reliforp/reli-prof/pull/384
- 今年に俺が書いたコードの中で一番頭悪いコードオブザイヤーを受賞できそうなやつ
- 記事でちょっと言及していた VM スタックをスキャンするやつ、驚くべきことに案外ちゃんと動く
Reddit で「PHP の true
と false
と null
は定義済み定数ですが何か?」という謎のレスバをしていた
- https://www.reddit.com/r/PHP/comments/18jou7h/comment/kdmiq5a/
- PHP の
true
とfalse
とnull
は case-insensitive な定義済定数であり、キーワードではない - PHP Parser や php-ast などのパーサでもソースコード中でのこれらの参照は AST 的には定数フェッチであり、リテラルの参照ではない
- VM 命令列へコンパイルされる時点では zval の直接参照まで解決されてるので、通常は意識することはないと思う
- なおこれは通常のグローバルネームスペースへのフォールバックとは異なる仕組み
- コンパイル時に行われる定数式評価の段階でこれらの 3 定数については特別扱いがされた上、ある種の interning により同じ
zend_constant
/zval
が参照されている - よって構文レベルでは実際に定数扱いで VM の定数表にも登録されているものの、実際にみんなのコードに書いてある
true
とかfalse
とかnull
とかが完全に他の定数と同じように処理系に扱われているかというと、そこはそうでもない
- なお reddit でも書いてるけど、これらの型の値の
zval
的な扱いは各操作中で型情報部分のみが見られていて、値部分は全然使われておらず、メモリ上ではキャスト前の値部分がそのまま入ってるみたいなことがあったりする- これはちょうど騙されていた(?)のを直したところだったりした