😎

今週の PHP 2022/10/01 〜 2022/10/07

2022/10/07に公開

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

Internal

mb_trim の件

RFC 出そうとしている人のメールが、どうしても Internals に届かないということで、まだ進んでない。
メール届いた?
届いてないよ

みたいなやり取りがされている。

https://github.com/php/php-src/issues/9216

Alias for int|float - Externals

https://externals.io/message/118693

number っていう便利な型が欲しくない?という話

さらに、こんな感じで複合型を use 文で定義できるようにしようぜという。

use int|float as numeric;

この手の Type Alias に関する議論は、なんどもされているそうで、基地の問題として

Alias が定義される場所と、それが評価される場所に関して、いくつかの問題があるよと。

例えば、A, B というインタフェースでそれぞれ同名の alias が使われたら、それを実装した C クラスではどっちが評価されるの?とか

このメールを送ってきた人は、既存の議論をすべてチェックした上で、新しく RFC を書くよ!という話でしたので、RFC を楽しみに待ちましょう。

Union type casts - Externals

https://externals.io/message/118744

こんなアイデアです。

$foo = (int|float)$bar;

どちらの型に Cast されるのかイマイチ明確でないのがアレだなという気がします。

上の Type Alias の話にもちょっと似ているなと思います。複合型をフィルターとして使うのとは意味が違うなぁ。

Sanitize filters - Externals

https://externals.io/message/118723

PHP の FILTER_SANITIZE_**** についてのご相談。

https://www.php.net/manual/ja/filter.filters.sanitize.php

たくさん存在するのですが、それぞれ動作に一貫性が無いということで、メール内で指摘を列挙されています。

まあ、わかりにくいし、つらみが多いよねという意見が多数。

いや、FILTER API はそもそも、大体おかしいという意見も出てきて、盛り上がっています。

藪をつついたこの議論は、一体どこに向かうのか?

Experimental features - Externals

https://externals.io/message/118740

RFC プロセスは、ちょっと時間がかかる。バージョンが上がるまで機能を追加できない。
だから、実験的機能というのを PHP に作ったらどうか?という提案

以前、話し合われていたらしい https://github.com/PHPGenerics/php-generics-rfc/issues/49

いや、それは 拡張でやればよくないか?などと、たくさんの議論がされています。

Preventing stack overflows - Externals

https://externals.io/message/118777

Stack Overflow を防ぐアイデアを提案するよというお便り

https://github.com/php/php-src/pull/9104

StackOverflowが発生する前に Exception をスローすることで、検知可能にするというもの。
Stackサイズは環境依存なので、言語側で環境ごとに適切なサイズを取得して、検知できるようにするというアイデアです。

Bugs

segmentation fault when sending SIGINT to PHP embedded in another program · Issue #9649 · php/php-src

https://github.com/php/php-src/issues/9649

Go で PHP を embed してる人の相談。Go 側で SIGINT が出ると、PHP側が SegV 出すというもの。

さらと、これの再現が取れる gist をコミッターの人が投稿していてさすが過ぎた

https://gist.github.com/arnaud-lb/d0f2282e66def91a6ee34e1537b3ac5f

一つの手として、ZEND_SIGNAL 無効化すると良いらしい。

もしかしたら、将来この方向でなにかやるかもしれないので、チェックしておいた。

Fix #77726: Allow null character in regex patterns by tobil4sk · Pull Request #8114 · php/php-src

https://github.com/php/php-src/pull/8114

正規表現で Null が使えるようになるという対応

8.2.0 RC2 の NEWS に入っていたので、いちおう取り上げた。

わかったようなわからないようななので、今度試してみよう。

String corruption on deployments with php-fpm 8.1.6 · Issue #8739 · php/php-src

数ヶ月前に報告されていたイシュー

https://github.com/php/php-src/issues/8739

負荷の高いアプリケーションで、稀に include に失敗するというイシュー
再現性が無いということで、報告主も途方にくれているというやつ。

include(/space/www/api2019/data/releases/20220607140425/vendor/la�R�F): Failed to open stream: No such file or directory

こんな感じで、対象ファイルの文字列がおかしくなっているらしい。

8.1.10 にすると、直ったらしい。

Mysqli converts TINYINT to a string after SUM() if the result of SUM is outside TINYINT, even if MYSQLI_OPT_INT_AND_FLOAT_NATIVE is set to true. · Issue #9665 · php/php-src

https://github.com/php/php-src/issues/9665

Mysqli を使った場合に TINYINT のカラムに対する SUM が TINYINT のサイズを超えると、文字列として扱われるという報告
そもそも、集計しているので、TINYINT 関係ないじゃんという気がしますが、こういうことになっているらしい。

CAST(SUM(num) AS UNSIGNED)

こういうワークアラウンドが存在するようです。

通常はみなさんPDO使うと思いますが、ちょっとしたツールとかで mysqli をサラッと使うことはあるかもしれません。

implode() refers to wrong parameter name · Issue #9667 · php/php-src

https://github.com/php/php-src/issues/9667

非常に趣のあるイシュー

https://www.php.net/manual/ja/function.implode.php

implode の第二引数が null の場合、implode が代替 signature だと誤解されて、エラーメッセージがよく分からんことになるという。

implode(): Argument #1 ($pieces) must be of type array, string given

mb_strpos matches illegal character when needle is '?' · Issue #9613 · php/php-src

https://github.com/php/php-src/issues/9613

mb_strpos, mb_stripos の挙動不審について

やはり、現状の挙動はよろしくないということで、ドキュメントの修正と、一定の移行期間を使っての挙動修正を行おうということになりそう。

Restore backwards-compatible mappings of U+005C and U+007E to SJIS-2004 by alexdowad · Pull Request #9666 · php/php-src

https://github.com/php/php-src/pull/9666

てきめんさん報告のイシュー。PRでましたね。

ファイル差分を見ると、泥臭さが理解できます。

https://github.com/php/php-src/pull/9666/files

Session ID changing with custom session handler in PHP 8.2.0RC3 · Issue #9668 · php/php-src

https://github.com/php/php-src/issues/9668

validateId メソッドを持たない場合に、カスタムセッションハンドラーの session_create_id が失敗するというもの

多分、以前出ていた https://github.com/php/php-src/issues/9583 と同じやつ

修正PRは出ています。

https://github.com/Girgias/php-src/commit/1f81a3b9a79970b867e473451cbe68c7f841a782

The help document of php misses two options · Issue #9670 · php/php-src

https://github.com/php/php-src/issues/9670

php -hC q オプションのことが出力されないという話。

https://www.php.net/manual/en/features.commandline.options.php

マニュアル側には乗っている。でも、CGI用のオプションだから、CLIのAPIからは削除しても良い?みたいな話になっている。

$length argument for fpassthru · Issue #9673 · php/php-src

https://github.com/php/php-src/issues/9673

HTTP range requests の実装をしている人からのお便り
https://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests

readfile や、fpassthru は オフセットや長さを指定する引数がない。
fread でループするのは苦痛だ。 なんか教えてくれ!

stream_copy_to_stream という関数があるよ!というお答え。
何でもあるね PHP

Major overhaul of mbstring (part 26) by alexdowad · Pull Request #9592 · php/php-src

https://github.com/php/php-src/pull/9592

master にマージされました。

Add Randomizer::getBytesFromAlphabet() method by joshuaruesweg · Pull Request #9664 · php/php-src

https://github.com/php/php-src/pull/9664

Randomizer に新しいメソッドを追加するというPR

RFC プロセスが必要なのかな?それとも、8.2にインクルードされるのかな??

と思ったら、RFC プロセスへ向かうようです。

https://externals.io/message/118762

Add support for cloning readonly properties by kocsismate · Pull Request #9497 · php/php-src

https://github.com/php/php-src/pull/9497

インターナルで議論されている Readonly の制限について、クローン時には緩和するという趣旨の対応
RFC ラベルがついているので、今後 RFC プロセスを経ることになります。

Problem when ISO-2022-JP-MS is specified in mb_ encode_mimeheader · Issue #9683 · php/php-src

https://github.com/php/php-src/issues/9683

ポロポロと出てくる ISO-2022-JP-MS 系不具合

https://3v4l.org/ucPUC

Function array return type · Issue #9486 · php/php-src

https://github.com/php/php-src/issues/9486

Array Type の 提案イシュー。このまま RFC プロセスへご案内

こんなやつね。現在の ArrayShapes でサポートされているような記法を言語側でサポートしようというもの。

注) 一ヶ月前のイシューでした。新しいコメントが入っていたので、今週のイシューと勘違いして拾ってます。

public function foo(): array<int, Role>
{
    ...
}

The behavior of mb_strcut in mbstring has been changed in PHP8.1 · Issue #9535 · php/php-src

https://github.com/php/php-src/issues/9535

mbstring 関連は、いろんな関連があって、全容把握できていない。
もうちょっと、方向性がはっきりしてきたらまとめてみたい。

Discussion