今週の PHP 2023-01-28 〜 2023-02-03
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 では、英語圏のアルファベットのことだけ言及してるけど、文字は世界にいっぱいあるんやぞという返信があって、妙に納得しました。
たとえば、 ++'あ'
で い
になりますか?みたいな話でもあります。
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
配列のインデックスとして使った際の 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