1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PHP ぼやき日記 2023-12-17

Last updated at Posted at 2023-12-17

不定期に誰に向けるでもなく PHP に関する雑な殴り書きをしている。日付が変わってから変わる前の日付の奴だと言い張って投稿するくらいの雑さ加減。

Psalm 5.18.0 が降ってきていた

オレオレメモリプロファイラで memory_limit 越え時の真のコールスタックを得る実装を書いた

Reddit で「PHP の truefalsenull は定義済み定数ですが何か?」という謎のレスバをしていた

  • https://www.reddit.com/r/PHP/comments/18jou7h/comment/kdmiq5a/
  • PHP の truefalsenull は case-insensitive な定義済定数であり、キーワードではない
  • PHP Parserphp-ast などのパーサでもソースコード中でのこれらの参照は AST 的には定数フェッチであり、リテラルの参照ではない
  • VM 命令列へコンパイルされる時点では zval の直接参照まで解決されてるので、通常は意識することはないと思う
    • なおこれは通常のグローバルネームスペースへのフォールバックとは異なる仕組み
    • コンパイル時に行われる定数式評価の段階でこれらの 3 定数については特別扱いがされた上、ある種の interning により同じ zend_constant / zval が参照されている
    • よって構文レベルでは実際に定数扱いで VM の定数表にも登録されているものの、実際にみんなのコードに書いてある true とか false とか null とかが完全に他の定数と同じように処理系に扱われているかというと、そこはそうでもない
  • なお reddit でも書いてるけど、これらの型の値の zval 的な扱いは各操作中で型情報部分のみが見られていて、値部分は全然使われておらず、メモリ上ではキャスト前の値部分がそのまま入ってるみたいなことがあったりする
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?