👻

今週の PHP 2023-01-28 〜 2023-02-03

2023/02/04に公開

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

Internal

リリース

Deprecate ldap_connect with host and port as separate arguments - Externals

ldap_connect には、現在3つの引数パターンがある

  • $ldap_uri を引数にとる
  • 文字列の $host と数値の $port を引数にとる
  • ドキュメントにも載ってないさらにたくさんの引数を取る OracleLDAP 向けの引数

この2番目、3番目は Deprecate にしませんか?というお便り。

RFC は大掛かりすぎるので、8.3 向けの全体的な非推奨を扱う RFC に追加する流れになりました。

https://wiki.php.net/rfc/deprecations_php_8_3

[RFC] [Discussion] Typed class constants - Externals

型付き定数のRFCに関するご意見募集スレッド

https://wiki.php.net/rfc/typed_class_constants

void, callable, never を除く全ての型が使用可能です。

RFC に対する細かい指摘が行われていて面白いです。概ね、好意的に受け入れられている RFC です。

[VOTE] include cleanup - Externals

PHP ソースコードの include のリファクタリングについて、投票が開始されました。

https://wiki.php.net/rfc/include_cleanup

Should #include directives be cleaned up?

投票の一項目目は、そもそもリファクタリングすべきかという内容ですが、現状では可決は難しそうです。
internals でのコミュニケーションもそうですが、ちょっと急ぎすぎているという感じがあります。

Proposal to add a $length parameter to fpassthru and friends - Externals

fpassthrue$length を引数として追加しようかね?という提案に対するご意見募集スレッド

現状は、EOF まで読み取ってしまうので、長さ指定出来るようにしたいということですね。

stream_copy_to_stream 関数を使えば、現状でも回避することはできるようです。

なるべく PHP は薄いラッパーでいてほしいという気持ちもあるので、別になくてもいいかなとは思う。

[RFC] Path to Saner Increment/Decrement operators - Externals

Increment/Decrement 演算子の正しさを追い求めるスレッドの続報

internals では、英語圏のアルファベットのことだけ言及してるけど、文字は世界にいっぱいあるんやぞという返信があって、妙に納得しました。

https://3v4l.org/k0Nti

たとえば、 ++'あ' になりますか?みたいな話でもあります。

RFC proposal: function array_filter_list() to avoid subtle bugs/workarounds - Externals

array_filter を使うと、配列がリストではなくなってしまうので、array_filter_list 関数を追加して、リストを filter したら、リストが返ってくるようにしたいという RFC を作ろうと思うんだけどという相談スレッド。

ユーザーランドで array_values すればいいじゃんという返信がきています。

array_filter の結果がリストじゃなくなることは、意図された挙動だと思うので、私もこの提案はいらないかなと思ってしまいます。
array_diff も同じことだけど、別に添字をリセットしたくはないようね?という返信もあって、納得感あります。

array_diff_list とか array_intersect_list も欲しいといわれたらどうしよう、という話の展開になって面白いです。

やっぱりユーザーランドで array_values すればいいかなと思ってしまう。

Official Preprocessor - Externals

公式のプリプロセッサーを導入しようずというお便り。

現在の PHP は厳密な型を維持するプログラミングを行うために、 phpdoc アノテーションと静的解析ツールに頼っている。
そのため、新しい #declare ディレクティブを導入して、型チェックのプリプロセスを実行しようぜ!という話です。

要するに PHPStan 的なことを、公式でプリプロセッサーとしてサポートしようということです。
そして、プリプロセスが済んだ PHP からは、余計な型情報が除去されるということも言及されています。

これって、TypeScript のようなトランスパイラなのかなと考えると、公式というよりはそういう言語を作るほうが速そうな気がします。
古くは CoffeeScript などもありましたね。

っていうか、Hack あるじゃんという気持ちにもなりました。

Bugs

Add support for CURLOPT_QUICK_EXIT · Issue #10454 · php/php-src

CURL の新しい機能性の追加です。具体的には設定項目が増えるようです。

論よりコードで、下記の PR を見るのが早いです。

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

mb_scrub does not attempt to scrub known-valid UTF-8 strings by alexdowad · Pull Request #10409 · php/php-src

修正内容とかは、まあアレなんですけど、 mb_scrub っていう関数とか、まじで使ったことないし、知らないという驚き。

不正なバイト列を代替文字に置き換えるという響きがもはやよくわからない。不正とは......

Reset JSON_G(error_code) after calls with JSON_THROW_ON_ERROR · Issue #10166 · php/php-src

json_last_error がリセットされない問題の続報。

一旦クローズされましたが、粘りで再開。

過去の議論などが出てきています。
json_last_error が常に直近の json_encode/decode の結果を見ないのはおかしいよね?という話。

JSON_THROW_ON_ERROR implementation detail - Externals

現状の対話内でのアイデアは下記2つです。

  • フラグを用意して、挙動を変えられるようにする
  • json_reset_last_error という関数を追加して、リセットできるようにする
  • json_encode(0) でリセットする(最悪の場合)

フラグが一番、透明性のある解決策かもなという感じもします。明示的なリセットは、他の Library と挙動も合わないしという感じ。
さて、これ RFC なのかな?

Warn on implicit bool to int conversion when using as array offset · Issue #10466 · php/php-src

https://3v4l.org/TrG4u

配列のインデックスとして使った際の bool 型に対する「暗黙の型変換」に関する議論。

false は 0 で、 true は 1 になるけど、Deprecation は出ない。この挙動について 8.0 あたりで型変換のルールが若干調整されたので、どうなの?という議論です。

RFC は出ているのですが、議論は進んでいないですね。

https://wiki.php.net/rfc/deprecate-boolean-string-coercion

open_basedir insufficient fix #76359 · Issue #10469 · php/php-src

open_basedir に対する不完全な修正を指摘するイシューです。
ディレクトリトラバーサルを防ぐ設定ですが、相対パスと chdir を駆使して /etc/passwd の参照に成功しています。

Cannot declare class because the name is already in use when using opcache preloading · Issue #10477 · php/php-src

opcache preloading を使ったときに、class がすでに定義されているとして、エラーになってしまうというイシュー
以前にも、cache したあとに、再度同じクラスをキャッシュしようとする不具合がありましたが、同様のものかもしれません。

バージョンは、 8.1.13, 8.1.14 ということなので、8.2 系にも普通に残ってそうな不具合です。
今後が注目されます。

Custom properties of DateTimeImmutable child classes are not serialized · Issue #10152 · php/php-src

DateTime を継承したクラスにおいて、追加したメンバ変数がシリアライズに含まれない不具合ですが、修正されました。
次のマイナーバージョンに入ることでしょう。

Mark certain strings as valid utf8 based on operations by Girgias · Pull Request #10463 · php/php-src

演算の種類によっては、入力値が UTF8 であることをチェックしたほうがいいのかな?というご意見募集PR。
PRの説明には、mb_check_encoding のパフォーマンスが向上していることをチェックするマイクロベンチのコードが貼られています。

試しに実行してみると、7.4 は特にパフォーマンスが悪いですが、8.2 に向かうに従って、劇的にパフォーマンスが向上しています。
パフォーマンスが上がると、内部処理に追加で実行してもいいかなという気分になるのは面白いですね。

内部では、mb_check_encoding を行うと、文字列に valid UTF-8 のフラグが立つようです。現状では JIT 最適化の際にフラグが飛んでしまっているようなので、この PR でそのへんの挙動も修正されているのですが、これ結構な BC ブレークにならないかな。

ポイントは、valid UTF-8 のフラグをつけ忘れたことで発生する不具合が起きるのではという懸念です。
最適化周りでは、もう少し不具合が出そうな気もします。

ともあれ、直近のリリースが楽しみではあります。

そして、早速、修正も入ってきている。

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

DEBUG: Suppress Fatal error on arginfo / zpp mismatch detection · Issue #10451 · php/php-src

debug ビルドの際に発生する引数ミスマッチを迂回するフラグを追加したいという Zeriyoshi さんのイシュー。

ABI-Breaking というコメントが nikic から来てます。つまり、patch ではなく RFC レベルにしてよってことなのだろうか。

PHP servers · Issue #10491 · php/php-src

イランで PHP ダウンロードするのが、めちゃくちゃ時間かかるんですが......というお便り。
3時間弱かかっていて、それは確かに辛い。

Discussion