🔥

今週の PHP 2022/07/02 〜 2022/07/08

2022/07/09に公開

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

今週も Feature Freeze 直前の RFC スペシャルです。

Internal

Feature Freeze PHP 8.2

July 19th

PHP: rfc:dnf_types

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

Disjunctive Normal Form Types 採択されました。
PHP マニュアルでどう翻訳されるのか? DNF型?

https://scrapbox.io/php/DNF型

型宣言を論理式で表現できるものと覚えておけばOK

PHP: rfc:iterator_xyz_accept_array

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

iterator_* 形式の組み込み関数について、すべての iterables を受け取れるようにしようという RFC です。

自分ではこれを意識したコードを書いたことないのですが、is_array とか書いて、チェックしなくて良くなるのはいいですね。

今の所の情勢では採択されそう。

PHP: rfc:json_encode_indentation

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

json_encode に インデントを制御する4つめの引数を導入しようという RFC

否決されそう。

PHP: rfc:constants_in_traits

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

歴史的経緯まで踏まえた丁寧な RFC であり、実に素晴らしい内容だと思ったが、やはり better to have という感じが拭えなかったのか旗色が悪い。

No を Vote した人の意見

  • そもそも Trait は PHP に不必要、これ以上 Trait は Scope を広げてほしくない。
  • Trait で共有される不変条件は、オブジェクト、関数、静的関数で明確に分離されるべき
  • Trait は、それが利用された箇所の Public API を知ることができないので、self::XXXX とかはよくわからない何かを指し示す可能性が有る
  • use trait1, trait2, trait3 みたいなケースを考えても、互換性チェックが大変で、たくさんの潜在的なエラーシナリオが生まれる
  • でも、このRFCはすごくよく書けてるね!!!これについては Sebastian Bergmann も +1

コレに対しては

  • Abstract クラスをそこら中で使うよりマシやろ
  • Trait が批判されているのは、使うべきでない文脈での使用によるものばかりだ

などの意見も寄せられており、君たち Vote 前にその指摘合戦してほしかったなと思うなど。

sji さんも、そもそも前提条件として Trait そのものの有用性みたいなのを載せておけば良かったねと返信。

修正内容の PR もあるから、非常に参考にもなる。
https://github.com/php/php-src/pull/8888

PHP: rfc:curl-url-api

https://wiki.php.net/rfc/curl-url-api

おや、否決されるぞ...
議論が深まりきらなかったということかもしれん。(あまり詳細には追ってない

PHP: rfc:auto-capture-closure

https://wiki.php.net/rfc/auto-capture-closure

現状は60%くらいの賛成票なので、否決の方向性です。
やはり、functionfn になるだけじゃねーかみたいな論調は根強く残っています。
auto capture は初心者殺しになるという PHP では大事にされる観点からも否定的な意見が入りやすそう。

PHP: rfc:fetch_property_in_const_expressions

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

現状59%の賛成票なので、否決の方向性ですが、まだ票田が残ってそうなので、この先のディスカッション次第かもしれません。

これでできるよね?という意見による NO であったり
https://3v4l.org/BCqrS

PHP: rfc:random_extension_improvement

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

zeriyoshi さんの2個目のRFCもvotingです。

Random 拡張に対する補足的な RFC なので、基本的に Accept される方向で Vote されてます。

PHP 8.0.21 Release

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

Bug Fix が入りました。

PHP 8.1.8 Release

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

SJIS のチルダ、バックスラッシュの変換についてのバグフィックスが入りました。
https://github.com/php/php-src/issues/8281

めでたし

PHP 8.2.0 alpha3

Available for Testing

https://downloads.php.net/~sergey/

Karma for voting

Vote する権利って、どうやって付与されるの?という質問のような苦情のようなスレッド

https://externals.io/message/115464

なぜ、Aaron Junker は decline された RFC が1個あるだけなのに、Vote できるの?と

返信が合って、Research のために取得したアクセスだよということですが、どういう仕組みなのかはよくわからなかった。

また、後日ちょっと調べてみようかな。


Bugs

wish: config option to make undefined array key a notice again · Issue #8906 · php/php-src

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

undefined array key は notice に戻せませんか?という相談

まあ、無理なんだがな。

migration 中であれば

set_error_handler(function($errno, $error){
    if (!str_starts_with($error, 'Undefined array key')){
        return false;  //default error handler.
    }else{
        trigger_error($error, E_USER_NOTICE);
        return true;
    }
}, E_WARNING);

こんなコードで避けられるねと。

strcmp return value changed between 8.2 alpha 1 and alpha 2 · Issue #8907 · php/php-src

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

今までの挙動
https://3v4l.org/Iue7N

最新の挙動
https://3v4l.org/Iue7N/rfc#vgit.master

負の整数が返ってくるということは同じだけど、数字の中身が変わっている

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

これで入り込んだらしい

挙動としては正常で、8.2 の Upgrade にちゃんと書こうねとなって、書かれた

https://github.com/devnexen/php-src/commit/6f123c63e8d26c7f225c1d9bdc0c8360ad5a9037

php-intl not correct output in transliterator_transliterate on alpine-3.16 with new icu-dev 71.1.r2 version · Issue #8917 · php/php-src

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

継続的にくる intl モジュールに対するイシュー。alpine が データセットを英語とそれ以外で分割してしまったのが原因。

でもって、PHP の docker image 側のイシューはほんの少し動きがあった

https://github.com/craftcms/docker/pull/61

craftcms 側では、PHP の本流側の対応を待とうということになった。

https://github.com/docker-library/php/issues/1302

本流側に下記のような Ping メッセージ

Is it planned to add icu-data-full to the alpine 3.16 images?
If not, I fear that many developers will spend hours trying to understand why they get issues with dates.

全く持って同意。初見殺しも甚だしいので、icu-data-full は最初から含めるべきだと思う。PHP の複雑性を職人レベルにまで引き上げないように調整していくべき。

Incorrect multiplication if used before operation (int) · Issue #8937 · php/php-src

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

IEEE 754 の問題です。

https://ja.wikipedia.org/wiki/IEEE_754

浮動小数点計算なので、

echo (int)(314.15*100);
echo "\n";
echo (int)(314.14*100);
echo "\n";
echo (314.15*100);
echo "\n";

一行目は、31415 ではなく、31414.999999... になります。int にキャストすると切り下げになるので、31414 になるというわけです。

このような問題の解決には、round を使って端数を適切に扱ったり

bcmath 関数を使いましょう。

https://3v4l.org/XblpE

https://www.php.net/manual/ja/book.bc.php

その他にも GMP なども使うことができます。

https://www.php.net/manual/ja/book.gmp.php

数値計算は、小数点が絡むときは要注意です。

Type intersection not working with traits · Issue #8941 · php/php-src

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

Trait が 交差型で使えないというイシュー
Trait は型ではないので、使えない。
じゃあ、特定の Trait を使っているクラスのみ許可する場合はどうしたらいいんだよ?という質問者への回答として

Marker interface を使ったら?という提案

https://3v4l.org/PblG3

これは、Trait を利用するクラスは、約束として、そのTraitの利用を表す Interface を implement することで、表現している。

これと似たようなことを Trait のみでもできるようにする提案は過去にされていた

https://wiki.php.net/rfc/traits-with-interfaces

単一継承を補う解決策としての trait に、色んな提案がされているが、あまり進展はしていない。

Discussion