🍐

今週の PHP 2022/08/27 〜 2022/09/02

2022/09/02に公開

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

Internal

What type of Exception to use for unserialize() failure?

ここは一つ、unserialize は挙動を一致させようぜとういことで PoC が出てきました。

PoC

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

UnserializationFailedException

そもそも E_WARNING を出しているのですが、Exception をスローするように修正されるのはBC ブレーク

というわけで、8.3 では E_WARNING 継続
9 で Exception にしようという意見

それにたいして、 selialize/unserialize は特定バージョン内の信頼できるソースに対してのみだけだよね?
であれば、問題ないのでは?直しちゃおうよ。という意見

RFC json_validate() - status: Under Discussion

json_validate は、深さエラーを派出すべきか?というコメントにたいして、validation という行為はいかなるエラーも出すべきではない。
あくまで、validation の結果として boolean を返すべきという意見があり。

さらに、戻り値について...

json_validate した結果で直接分かるのではなく、json_last_error とかでエラーを取得して処理するの?それはPHPウエィなのどうなの?という質問
この辺、私も識者の意見を聞いてみたい。

8.2 Branch cut

8/30 に PHP 8.2 の branch cut が行われます。

これはつまり.... PHP 8.3 向けの対応が master で開放されたということになります。

ksort breaking change

8.0 は revert
8.0.23 も revert
8.1 も revert
8.1.10 も revert

というわけで、ksort の修正は 8.2 に入ります。

Release

8.2.0 RC1 https://downloads.php.net/~pierrick/

8.1.10 https://www.php.net/ChangeLog-8.php#8.1.10

8.0.23 https://www.php.net/ChangeLog-8.php#8.0.23

RFC Asymmetric Visibility

Readonly も取り入れようという話になり
public protected(set) readonly string すごい字面だ

RFC 作成者である Larry さんから、詳細な説明が追加されました。

そのなかで3つのポイントが上げられています。

  1. Asymmetric visibility.
  2. Accessor hooks.
  3. Disabling references on properties.

今回のRFCは、1が対象なのですが、議論のなかで 2,3 のことが触れられています。
それがなぜなのか、将来的にどのような機能性がPHPに足されるということなのか、ちょっとまだ理解が及んでないです。

No longer allow block mode for declare(encoding)

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

https://www.php.net/manual/ja/control-structures.declare.php#control-structures.declare.encoding

そもそも、declare(encoding) の存在を知りませんでした。
今回の件は、ファイル内で encoding を細かく切り替えるというユースケースは無いだろうから、カーリーブレイスの使用を禁止しようというものです。
8.3 で取り込まれそうです。

もともと、この議論の発端になったのはイシューはこちら。

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

Bugs

Non-strict comparation of object and scalar value · Issue #1773 · php/doc-en

https://github.com/php/doc-en/issues/1773

Object と Scaler 値の比較について、

https://3v4l.org/8esOY

全部 true じゃないの?というイシュー

PHPの non strict な比較は特殊であるというコメントともに、これはドキュメンテーションイシューということで転送

Comparison with Various Types について、より充実した記述が追加される予定。

Make var_export/debug_zval_dump first check for infinite recursion on the object by TysonAndre · Pull Request #8046 · php/php-src

https://github.com/php/php-src/pull/8046#issuecomment-1229259497

var_export などが、再帰的参照で無限ループになってしまうことを、事前に検知して Warning 出しませんかという PR

今も、チェックされる挙動になっているように思えるけど....

PR を見るとオブジェクトに対する再起チェックということらしい。

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

スレッドをよく見ると、アクシデントで削除されてしまったコードを元にもどしたもよう。

sendmail works incorrectly in PHP8 alpine builds docker-library/php#1327

https://github.com/php/php-src/issues/8086#issuecomment-1229996586

Mail 関数の出力結果が CRLF になっていて困るという相談

PHP 8 系から、標準にそってCRLFに変更されたことが原因。
なので、CRLF を適切に扱えない SMTP 側が悪い。

この現象は Busybox を使っているユーザーで散見されるようなので、Alpine系使っている方は要注意

DateTime::getLastErrors() not returning false when no errors/warnings · Issue #9431 · php/php-src

https://github.com/php/php-src/issues/9431#event-7278757398

DateTime::getLastErrors がなんのエラーも無い時に false を返さないというイシュー
8.2 系で修正されます。

FPM. access.log with stderr begins to write logs to error_log after daemon reload · Issue #8885 · php/php-src

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

php-fpm が daemon reload 後に error-log に access-log の内容を出力してしまうというイシュー

FDの取り違えが起きていたようです。

https://github.com/php/php-src/commit/f92505cf24e90a74d33bea8f20ca977b63aa9d4f

[RFC] Add clamp function by thinkverse · Pull Request #7191 · php/php-src

https://github.com/php/php-src/pull/7191#issuecomment-1230351767

clamp function の RFC に対して激励のお言葉が入っていました。

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

php-cli core dump calling a badly formed function · Issue #8841 · php/php-src

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

Interactive shell から Seg V を発生させる方法の続報

$ php -a
Interactive shell
php > echo phpversion();
8.1.2
php > function f(){$a[];}
PHP Fatal error:  Cannot use [] for reading in php shell code on line 1
php > f();
Segmentation fault (core dumped)

以前のやつより、簡潔ですね。
function テーブルに f が登録されるが、fatal error で中身が存在しない状態になるので、関数呼び出しで呼び先がなくて Seg V が出るという内容でした。
とくに、進展してないのですが、直すのだろうか???

PHP 8.2 readonly classes can have dynamic properties created by unserialize() · Issue #9325 · php/php-src

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

unserialize を使うと readonly の property をいじれるというイシュー

fix されました。

https://github.com/php/php-src/commit/adb45a63c0f56bb4e04ffd74579de0c8ab9d722f

Deprecated: Creation of dynamic property RegexIterator::$5 is deprecated in %s on line %d

こんなメッセージが出るようになります。

Equivalent to "::class" for obtaining property and variable names as a string · Issue #9449 · php/php-src

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

property や variable の名前を文字列で取れる仕組みがほしいっすというイシュー

活用例として Doctrine が上げられていたので、俄然興味がわきましたが、::class と同じということは、文字列が返ってくるだけで
特に存在チェックとかがなされるわけではないのかもと思うと、そんなに意味があるのだろうかという気もしてしまう。

DateTime::modify('-1 month') returnt wrong value · Issue #9454 · php/php-src

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

ちょっと懐かしい感じのイシュー

2022-07-31 00:00:00-1 month
2022-07-01 00:00:00 になるのはなんで?という話

一ヶ月というのは、日にちの単位としてはゆらぎがあって、28日〜31日まであります。

そのため、-1 month06-31 になるのですが、そんな日付は存在しないので、次に有効な日付 07-01 になります。

このような計算を行う場合は、イシュー内の返信にもあるように、前月の最終日を取得するというロジックが良いです。

https://3v4l.org/2enZp

last day of previous month っていう表現がつかえるんですねぇ。

Increase maximum size of an uploaded file to 50Mbyte by mishanon · Pull Request #9315 · php/php-src

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

小さすぎないか?というイシュー。Internal にしてくれということでクローズになりそう。

変更可能な設定項目ではあるけれど、デフォルト値として小さすぎないですか?ということかと。

Native parameter attributes may not be used on promoted properties · Issue #9420 · php/php-src

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

#[SensitiveParameter] のアトリビュートを、コンストラクタープロモーションのプロパティにつけられないぞ!というイシュー
つけられるようになりそう。

本件は、8.2 で導入される、「ログに値が表示されないようにする」特殊なアトリビュートに関するイシューです。

修正内容はこちら。

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

DateTime increment with float number produces bad result · Issue #9459 · php/php-src

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

+0.5 day とか +0.5 month とかが変な動きをするというイシュー

日付、月などは、小数点を許さないようにする方向で話が進みそうです。それでよいと思う。

filter_var(): Unknown filter with ID 1172747872 · Issue #9461 · php/php-src

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

filter_var に関する不具合報告。

https://3v4l.org/3JEbK

8.0 系以降で、1172747872 を指定するとエラーになるという。

何かが起きている

fgetcsv() cause wrong parse on specific UTF-8 BOM encoded CSV · Issue #1792 · php/doc-en

https://github.com/php/doc-en/issues/1792

BOM付きのCSVを fgetcsv したときに parse がおかしいというイシュー

"" がそのまま文字列として取れています。BOMが文字として認識されており、enclosur としてダブルクォートがみなされていないことが要因です。

https://bugs.php.net/bug.php?id=49350
https://bugs.php.net/bug.php?id=63433

すでに同様のイシューは存在して、不具合ではないとされている。そのため、本件も bug ラベルは削除されました。

しかし、マニュアルにはユーザーコメントでしか書かれていないので、ドキュメントの追加は必要だろうという話の流れに。

該当のユーザコメントは https://www.php.net/manual/ja/function.fgetcsv.php 内の下記などがあります。

This function has no special BOM handling. The first cell of the first row will inherit the BOM bytes, i.e. will be 3 bytes longer than expected. As the BOM is invisible you may not notice.
Excel on Windows, or text editors like Notepad, may add the BOM.

Discussion