PHP ぼやき日記 2023-12-13

- [次回](https://qiita.com/sj-i/items/76ade0490d6c991871f5)
- [前回](https://qiita.com/sj-i/items/db793e09de33dd5e804d)

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

# nielsdos のひとが FFI 周りをわりと見ている
- [この 1 年ちょいほどの間でめちゃくちゃコミット入れてる](https://github.com/php/php-src/graphs/contributors?from=2021-10-18&to=2023-12-13&type=c) [nielsdos のひと](https://github.com/nielsdos)が最近わりと FFI まわりも見ている
    - https://github.com/php/php-src/pull/12916
    - https://github.com/php/php-src/pull/12915
    - https://github.com/php/php-src/pull/12906
- がんばってまともにしてほしい
- というかこのひとマジで学生……？ もう 1 年くらい活動してる気するけどひょっとしてこれと別に本業で研究やってんの……？イミフにもほどがある

# AMPHP の非同期 DB 接続ライブラリの新しい beta が出てる
- amphp v3 対応版（= Fiber 対応版）の beta が進んでいた
- https://github.com/amphp/mysql/releases/tag/v3.0.0-beta.7
- https://github.com/amphp/postgres/releases/tag/v2.0.0-beta.5
- https://github.com/amphp/sql-common/releases/tag/v2.0.0-beta.7
- https://github.com/amphp/sql-common/releases/tag/v2.0.0-beta.8
- NestedTransaction まわりの API が変わってるっぽい

# デジ庁サイトが Next.js から Drupal になったらしい
- https://www.digital.go.jp/
- 実際には [CMS 側は 2 年前から Drupal を利用していた](https://twitter.com/hal_sk/status/1734931944377606650)らしい
    - フロントだけ Next.js でヘッドレス構成だったのが、サイトの複雑化に伴いビルド時間や機能面で面倒になったとのこと

# PHP にローカルスコープの const みたいなの要るかなあ
- [このへんの会話](https://twitter.com/sji_ch/status/1734941804968218770)であらためて「要るかなあ」というのを思った
- 実装は多分そこまで難しくない、が、RFC プロセスでメリットを主張するのが難しい
    - 定数式の解決はやや魔境じみてるけどまあ、それでも実装についてはやってやれないほどではない
- あれば使う気がするけど、「ないと困るでしょ！」という主張をしづらい
- 誰か「ローカルスコープの const があればこんなに良いことが！」みたいな嬉しさを抱えている人がいればそれを俺に教えてほしい
- JS (EcmaScript) にローカル const が入ることになった経緯がわかると参考になるかな、と思って以前に少し調べたこともあるのだけど、ES 3.1 とかの頃の話になって議論・経緯がめちゃくちゃ追いづらいということだけが分かっている
    - 一部のセマンティクス・設計選択については[話の見つかった部分](https://esdiscuss.org/topic/newly-revised-section-10-for-es3-1)もあり、このへんの es-discuss の過去ログを漁ることになるのかなという気はする
    - もうちょっと探したら[セマンティクスの議論をする 2007-06-20 のチケット](https://web.archive.org/web/20081204233829/http://bugs.ecmascript.org/ticket/112)は見つかった
        - 一応[関連議事録1](https://archives.ecma-international.org/2007/TG1/tc39-tg1-2007-038.pdf?_gl=1*h5uap3*_ga*MTMyNzMwMjYxMi4xNzAyNDg0MjIw*_ga_TDCK4DWEPP*MTcwMjQ4NDIyMC4xLjEuMTcwMjQ4NjgzMi4wLjAuMA..&_ga=2.68262929.147161941.1702484221-1327302612.1702484220)
    - また[こっち](https://esdiscuss.org/topic/const-formal-parameters) を見ると 3/4 のブラウザで存在した機能が標準化された流れ、なのか……？
        - "previously mentioned" というのは多分[これ](https://web.archive.org/web/20140605044917/https://mail.mozilla.org/pipermail/es-discuss/2008-June/006538.html)
        - [2007-10-29 の記事](https://webreflection.blogspot.com/2007/10/cow-javascript-define-php-like-function.html) によると、当時のブラウザで Firefox と Safari は `const` をサポートしていて IE と Opera はサポートしていなかったようだ
        - [2010 年 8 月の IEBlog](https://web.archive.org/web/20100827145045/http://blogs.msdn.com/b/ie/archive/2010/08/25/chakra-interoperability-means-more-than-just-standards.aspx) によると、結局 ES5 での標準化が見送られたので IE9 でも未対応としていた
        - それが結局は ES6 でようやく入ることになった流れ
        - [当初実装としては ES6 に反しブロックスコープになっていないものもあった](https://esdiscuss.org/topic/legacy-const-attempt-2-re-legacy-const)が、結局はブロックスコープになるよう実装側をあわせているもよう
    - 先行してブラウザベンダが勝手に実装していたというのはあるとして、なんだかどうも基本的な欲求としては「write once……イイよね……」以上のものがないのではという気もしてきている
    - この流れならワンチャン Firefox や Safari のコミットログを追うともっと分かる可能性があるのでは？
    - Firefox は [1999-11-12 の Brendan Eich のコミット](https://github.com/mozilla/gecko-dev/commit/367ea33053dd797ecb45efacfc2ba00596cdb4f7)に const 追加が**急に**含まれているようだ
        - JS_HAS_CONST の定義やコメントから見ると JS2 の機能を `JS_VERSION == 150` で先取りするもののようだ
        - [1999-5-11 の段階ではもう JS 2 として構想に入ってる](https://github.com/mozilla/gecko-dev/commit/2eb1a7f08ff451bea08c2f3942e5318a30132f57#diff-137bd43d2dc24de0bf4f56c89e2b71bd5a463a98d11e6017ec2395421a8e071c)
        - その JS 2 構想をコミットしてる人（Brendan Eich のあとに Netscape の言語設計者となりまた JS の標準化を進めたりもした Waldemar Horwat）による [JS 2 の夢を語るスライド](https://www-archive.mozilla.org/js/language/evolvingJSTalk.ppt) に const が出てる感じを見ると、誤りを防ぐための const 導入にあたって hoisting で別の分岐ブロックでの宣言が問題となるみたいなシナリオを避けるようローカルスコープ（ブロックスコープ）での導入とした、という流れのもよう
        - これが JS 2.0 (ES4) からこぼれだして拡張として Firefox (というか Mozilla) の JS 1.5 実装へ入った、というのが結局は ES 3.1 提案の話にも出てきて、その後継であるところの ES5 には入りそこね、最後は ES6 へ入った、という流れ
        - Safari (というか WebKit) のほうは [2005-06-16 のチケットで提案](https://bugs.webkit.org/show_bug.cgi?id=3576)されて [2005-06-21 のコミット](https://github.com/qtwebkit/webkit-mirror/commit/a8a255be605bcc09a451105f4b456f56d72f36b2)で実装が入ってそう、またテストケースには Mozilla 側と同じのを使ってそう
        - PHP さんにも「write once……イイよね……」くらいで提案して別に良いのではないかという気もしてきたな……


# "Why we don't use return types on controller actions" を見て「どうかなあそれ」と思った
- https://masteringlaravel.io/daily/2023-12-13-why-we-dont-use-return-types-on-controller-actions
- Laravel のコントローラアクションはいろいろな型の値を返せるのでテキトーな 1 つを指定して型エラーが出るのは false positive だと言い張る人を見つけた
- 返すものが変わるのはその action が満たすべき他部品との通信規約への明確な変更であり、また action の型宣言が例えば `\JsonSerializable` な型によって通信規約を表現して悪いことは何もないので、雑をやることへの無茶な言い訳に見えなくもない
- 返り値型宣言はそのメソッドの実装の誤りを見つけるのが主眼で、アプリケーションの通信規約において何が誤りかを規定するのはフレームワークではなくアプリケーションである筈だ