今週の PHP 2023-01-21 〜 2023-01-27
PHP のメーリングリストから、気になった情報をピックアップします。
Internal
RFC: rules for #include directives - Externals
ここで言う #include
は PHP のソースコードの方です。
私自身の理解度が浅い分野ではあるのですが、大まかにまとめると
- 巨大コードベースで
#include
が不適切になっていたのでリファクタした - 4つほど PR マージしたら、
--enable-dtrace
オプションのビルドがエラーになるようになった - それに対する不具合修正をしたが、これまでの PR もすべて戻せという方向に発展し.....
- よし、それなら RFC で解決しようじゃないか!
という流れです。一連のやり取りには激しい言葉も一部見られます。
PHP の機能性には影響しないので、 RFC を作るものではないという意見もありましたが、紛争解決のためやむなしという感じです。
https://wiki.php.net/rfc/include_cleanup
後方互換性に関する記述にもある通り、この RFC は PHP としての機能性には一切影響を与えません。
Loading SQLite extensions on PDO - Externals
SQLite3 拡張を直接ロードする必要性が出たんだけど、まあ通常は PDO 使っているよね。ドライバ固有の機能が PDO で使えないのは辛くないですか?というお便り。
現在 https://wiki.php.net/rfc/pdo_driver_specific_subclasses この RFC が提出されていますので、質問者さんの要望は PHP 8.3 になったら満たされそうです。
[RFC][Vote] Asymmetric Visibility - Externals
非対称可視性に関する RFC ですが、善戦むなしく否決となりました。やはり readonly との棲み分けが難しかったですね。こう色々と議論を見ていくと、むしろ readonly の課題を感じてしまいます。
https://wiki.php.net/rfc/asymmetric-visibility
[RFC] Path to Saner Increment/Decrement operators - Externals
saner
は「分別のある」という意味らしいのですが、分別のある加算・減算演算子とは......
-
++
と+1
、--
と-1
で、挙動が違うのを合わせる -
str_increment
str_decrement
を追加した文字列の加減算をサポートする
文字列の加減算については、2014 年に全会一致で否決されていました。
https://wiki.php.net/rfc/alpanumeric_decrement
今回は、新しい関数を追加するので、どうなるだろうか。
この RFC は increment
は +1
という意味に統一して、文字列の加減算を独立させることで、開発者の認知的負荷を取り除こうというものです。
そのため、否決された RFC とは、そもそも目的が異なります。
議論は多いですが、概ね好意的に受け入れられている気がします。
Introduce the abiltiy to use the first-call-callable syntax on non-static methods, statically - Externals
static な関数呼び出しに対して、1st クラスコーラブルを生成することができないというイシュー
これは、インスタンスが生成されてないから当然だろという気がしますが、このエラーは実行時まで遅延できるでしょ?というのが本題
つまり、実行前にインスタンスの割当ができれば、いいじゃないかという話です。
class Test {
public function test(): string { return 'test'; }
}
$closure = Test::test(...);
$closure->bindTo(new Test);
$closure();
そもそも、bindTo とか使ったことなかったです。
静的呼び出しでない関数の closure を静的に生成することの旨味がよくわかっていませんが、高度な抽象化の文脈では有用な機能なのかもしれません。議論内には pipe を作ろうとすると、こういう機能が欲しくなるという話が出ていました。
型さえ合っていれば、自由自在に放り込めるようなコーラブルが生成できると考えたら良いのかな。それでいて、割り当てるインスタンスは、実行スレッドから指定することができるという。
まだ RFC になるには至っていないので、既存の解決策なども出てきそうです。
[RFC] Pass Scope to Magic Accessors - Externals
マジックアクセッサ __get
で呼び出されたメンバ変数のスコープを簡単に参照出来るようにしようというものです。
https://wiki.php.net/rfc/pass_scope_to_magic_accessors
それ、debug_backtrace
で出来るよという意見がでています。
[RFC] [Vote] Readonly amendments - Externals
Readonly の訂正 RFC ですが、投票開始です。長らく議論されていたものです。
https://wiki.php.net/rfc/readonly_amendments
プロポーザルは2つに分かれていて
- readonly じゃないクラスが、readonly のクラスを継承できるようにする
- クローンのタイミングで readonly のメンバ変数を再初期化できるようにする
現状では、1 は無理そうで、2 は全会一致で通りそうです。
[RFC] Saner array_(sum|product)() - Externals
正しい array_sum
array_product
という RFC
現状の挙動
- 最初に 0 または 1 で戻り値を初期化
- TypeError が起きたらスキップ
- 起きなかったら int か float にキャストして 加算・積算する
正しい?挙動
型チェックを行い、タイプエラーを出す。 オブジェクトは数値キャストが実装されていれば、キャストされて演算される。
戻り値は int|float になるのだろうか......
というこ感じのようです。
まだ、コメントはそんなに集まっていません。通常のオペレーターによる演算も型エラーが出ますので、それに挙動を合わせましょうという話ですね。
既存のコードが、不安定な入力で動いてしまっている場合は、この RFC が実装されたあとに動かなくなりますね。
それは、良いことかもしれないし、悪いことかもしれない。
Bugs
Implement DateTime Exceptions RFC by derickr · Pull Request #10366 · php/php-src
先ごろ承認された DateTime
例外の RFC に対して、実装がコミットされています。
xxh3 hash ignores seed if string? · Issue #10305 · php/php-src
xxh3
を hash アルゴリズムに選択した場合、文字列の seed が無視されているというイシュー。ドキュメントには、 136 byte 以上の文字列とかいてあるので、誤った挙動ではないけど警告はしてあげるべきです。
ひとまず、最速で Deprecation を出すように修正して、8.3 で問題なくなるように修正するという方向になりそうです。
can we make curl_close() write CURLOPT_COOKIEJAR again? · Issue #2239 · php/doc-en
PHP 8.0 以上になると curl_close
されたあとに cookiejar が出力されないという報告。
これは、せめてドキュメントに書かれるべきではという主張です。
しかし、すでにドキュメントは書かれていたという
https://www.php.net/manual/en/function.curl-close.php
This function has no effect. Prior to PHP 8.0.0, this function was used to close the resource.
そんなこと知りませんでした of the year です。
なので、 curl_close
の代わりに unset($ch)
してくれという回答。
ただし、resource を閉じることと、unset で変数割当をなくすことは、本質的には意味が異なります。
このあたり、curl
は正しく使うのがかなり難しい API になっている気がします。使うのが難しいというのは、設計の問題だと思うので、改善を期待したいところではあります。
私も知らなかったように、ほとんどの PHPer は curl_close
がなにもしないことを知らないはずです。それでいて Stack Overflow などのコピペコードには curl_close
が使われ続けるはずなので、せめて Deprecation したらという気がします。
Type error could print `false`/`true` type/value instead of `bool` · Issue #8329 · php/php-src
独立した false 型が導入されたので、エラーメッセージに出すときも bool
ではなく false
にしようねという修正がマージされました。
次のバージョンから入りそうです。
Apache Segmentation fault (11) disappears after print_r on a variable. can't understand... · Issue #10430 · php/php-src
Apache が SegV 出してたけど、print_r
を追記すると直るというイシュー。今後が注目されます。
opcache.jit=function skips arginfo / zpp consistency checks on debug build · Issue #10445 · php/php-src
opcache.jit=function
にすると、debug build においても arginfo /zpp consistency checks
がスキップされるというイシュー。
意味はよくわからなかったけど、意図した挙動らしい。
下記は、関連しているイシューです。
DEBUG: Suppress Fatal error on arginfo / zpp mismatch detection · Issue #10451 · php/php-src
デバッグ時に、MISMATCH のエラーを回避できるようにするというやつです。多分、来年くらいには理解できるようになっているでしょう。
Fixed link to Zend License to https without trailing `.` by zonuexe · Pull Request #10123 · php/php-src
Redirection されてるから、良いじゃん。ということで、tadsan の PR はクローズされました。惜しい。
Retrieving an enum case by its name · Issue #9352 · php/php-src
Dynamic Class Constant Fetch の RFC が承認されたので、こちらのイシューがクローズ。
PHP 8.3 からは、enum を名前で参照できるようになります。
PHP-FPM seagfault after update from PHP 8.1.13 to PHP 8.1.14 · Issue #10461 · php/php-src
PHP-FPM が SegV を起こすというイシュー。PHP 8.1.14 なので、現行の 8.1系最新バージョンです。
FPM 関連のバグフィックスが3件入っているので、デグレが起きたということかもしれません。今後要チェック。
Discussion