💡

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

2023/01/30に公開

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

Internal

RFC: rules for #include directives - Externals

ここで言う #include は PHP のソースコードの方です。

私自身の理解度が浅い分野ではあるのですが、大まかにまとめると

  1. 巨大コードベースで #include が不適切になっていたのでリファクタした
  2. 4つほど PR マージしたら、--enable-dtrace オプションのビルドがエラーになるようになった
  3. それに対する不具合修正をしたが、これまでの PR もすべて戻せという方向に発展し.....
  4. よし、それなら 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つに分かれていて

  1. readonly じゃないクラスが、readonly のクラスを継承できるようにする
  2. クローンのタイミングで 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 で変数割当をなくすことは、本質的には意味が異なります。

https://3v4l.org/1pR91

このあたり、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 のエラーを回避できるようにするというやつです。多分、来年くらいには理解できるようになっているでしょう。

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