今週の PHP 2022/08/27 〜 2022/09/02
PHP のメーリングリストから、気になった情報をピックアップします。
Internal
What type of Exception to use for unserialize() failure?
ここは一つ、unserialize は挙動を一致させようぜとういことで PoC が出てきました。
PoC
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つのポイントが上げられています。
- Asymmetric visibility.
- Accessor hooks.
- Disabling references on properties.
今回のRFCは、1が対象なのですが、議論のなかで 2,3 のことが触れられています。
それがなぜなのか、将来的にどのような機能性がPHPに足されるということなのか、ちょっとまだ理解が及んでないです。
No longer allow block mode for declare(encoding)
そもそも、declare(encoding)
の存在を知りませんでした。
今回の件は、ファイル内で encoding
を細かく切り替えるというユースケースは無いだろうから、カーリーブレイスの使用を禁止しようというものです。
8.3 で取り込まれそうです。
もともと、この議論の発端になったのはイシューはこちら。
Bugs
Non-strict comparation of object and scalar value · Issue #1773 · php/doc-en
Object と Scaler 値の比較について、
全部 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
var_export
などが、再帰的参照で無限ループになってしまうことを、事前に検知して Warning 出しませんかという PR
今も、チェックされる挙動になっているように思えるけど....
PR を見るとオブジェクトに対する再起チェックということらしい。
スレッドをよく見ると、アクシデントで削除されてしまったコードを元にもどしたもよう。
sendmail works incorrectly in PHP8 alpine builds docker-library/php#1327
Mail
関数の出力結果が CRLF になっていて困るという相談
PHP 8 系から、標準にそってCRLFに変更されたことが原因。
なので、CRLF を適切に扱えない SMTP 側が悪い。
この現象は Busybox を使っているユーザーで散見されるようなので、Alpine系使っている方は要注意
DateTime::getLastErrors() not returning false when no errors/warnings · Issue #9431 · php/php-src
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
php-fpm が daemon reload 後に error-log に access-log の内容を出力してしまうというイシュー
FDの取り違えが起きていたようです。
[RFC] Add clamp function by thinkverse · Pull Request #7191 · php/php-src
clamp function の RFC に対して激励のお言葉が入っていました。
php-cli core dump calling a badly formed function · Issue #8841 · php/php-src
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 が出るという内容でした。
とくに、進展してないのですが、直すのだろうか???
readonly
classes can have dynamic properties created by unserialize() · Issue #9325 · php/php-src
PHP 8.2
unserialize を使うと readonly の property をいじれるというイシュー
fix されました。
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
property や variable の名前を文字列で取れる仕組みがほしいっすというイシュー
活用例として Doctrine が上げられていたので、俄然興味がわきましたが、::class
と同じということは、文字列が返ってくるだけで
特に存在チェックとかがなされるわけではないのかもと思うと、そんなに意味があるのだろうかという気もしてしまう。
DateTime::modify('-1 month') returnt wrong value · Issue #9454 · php/php-src
ちょっと懐かしい感じのイシュー
2022-07-31 00:00:00
の -1 month
が
2022-07-01 00:00:00
になるのはなんで?という話
一ヶ月というのは、日にちの単位としてはゆらぎがあって、28日〜31日まであります。
そのため、-1 month
は 06-31
になるのですが、そんな日付は存在しないので、次に有効な日付 07-01
になります。
このような計算を行う場合は、イシュー内の返信にもあるように、前月の最終日を取得するというロジックが良いです。
last day of previous month
っていう表現がつかえるんですねぇ。
Increase maximum size of an uploaded file to 50Mbyte by mishanon · Pull Request #9315 · php/php-src
小さすぎないか?というイシュー。Internal にしてくれということでクローズになりそう。
変更可能な設定項目ではあるけれど、デフォルト値として小さすぎないですか?ということかと。
Native parameter attributes may not be used on promoted properties · Issue #9420 · php/php-src
#[SensitiveParameter]
のアトリビュートを、コンストラクタープロモーションのプロパティにつけられないぞ!というイシュー
つけられるようになりそう。
本件は、8.2 で導入される、「ログに値が表示されないようにする」特殊なアトリビュートに関するイシューです。
修正内容はこちら。
DateTime increment with float number produces bad result · Issue #9459 · php/php-src
+0.5 day
とか +0.5 month
とかが変な動きをするというイシュー
日付、月などは、小数点を許さないようにする方向で話が進みそうです。それでよいと思う。
filter_var(): Unknown filter with ID 1172747872 · Issue #9461 · php/php-src
filter_var に関する不具合報告。
8.0 系以降で、1172747872
を指定するとエラーになるという。
何かが起きている
fgetcsv() cause wrong parse on specific UTF-8 BOM encoded CSV · Issue #1792 · php/doc-en
BOM付きのCSVを fgetcsv したときに parse がおかしいというイシュー
""
がそのまま文字列として取れています。BOMが文字として認識されており、enclosur としてダブルクォートがみなされていないことが要因です。
すでに同様のイシューは存在して、不具合ではないとされている。そのため、本件も 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