今週の PHP 2022/07/02 〜 2022/07/08
PHP のメーリングリストから、気になった情報をピックアップします。
今週も Feature Freeze 直前の RFC スペシャルです。
Internal
Feature Freeze PHP 8.2
July 19th
PHP: rfc:dnf_types
Disjunctive Normal Form Types 採択されました。
PHP マニュアルでどう翻訳されるのか? DNF型?
型宣言を論理式で表現できるものと覚えておけばOK
PHP: rfc:iterator_xyz_accept_array
iterator_*
形式の組み込み関数について、すべての iterables を受け取れるようにしようという RFC です。
自分ではこれを意識したコードを書いたことないのですが、is_array
とか書いて、チェックしなくて良くなるのはいいですね。
今の所の情勢では採択されそう。
PHP: rfc:json_encode_indentation
json_encode に インデントを制御する4つめの引数を導入しようという RFC
否決されそう。
PHP: 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 もあるから、非常に参考にもなる。
PHP: rfc:curl-url-api
おや、否決されるぞ...
議論が深まりきらなかったということかもしれん。(あまり詳細には追ってない
PHP: rfc:auto-capture-closure
現状は60%くらいの賛成票なので、否決の方向性です。
やはり、function
が fn
になるだけじゃねーかみたいな論調は根強く残っています。
auto capture は初心者殺しになるという PHP では大事にされる観点からも否定的な意見が入りやすそう。
PHP: rfc:fetch_property_in_const_expressions
現状59%の賛成票なので、否決の方向性ですが、まだ票田が残ってそうなので、この先のディスカッション次第かもしれません。
これでできるよね?という意見による NO であったり
PHP: rfc:random_extension_improvement
zeriyoshi さんの2個目のRFCもvotingです。
Random 拡張に対する補足的な RFC なので、基本的に Accept される方向で Vote されてます。
PHP 8.0.21 Release
Bug Fix が入りました。
PHP 8.1.8 Release
SJIS のチルダ、バックスラッシュの変換についてのバグフィックスが入りました。
めでたし
PHP 8.2.0 alpha3
Available for Testing
Karma for voting
Vote する権利って、どうやって付与されるの?という質問のような苦情のようなスレッド
なぜ、Aaron Junker は decline された RFC が1個あるだけなのに、Vote できるの?と
返信が合って、Research のために取得したアクセスだよということですが、どういう仕組みなのかはよくわからなかった。
また、後日ちょっと調べてみようかな。
Bugs
wish: config option to make undefined array key a notice again · Issue #8906 · php/php-src
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
今までの挙動
最新の挙動
負の整数が返ってくるということは同じだけど、数字の中身が変わっている
これで入り込んだらしい
挙動としては正常で、8.2 の Upgrade にちゃんと書こうねとなって、書かれた
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
継続的にくる intl モジュールに対するイシュー。alpine が データセットを英語とそれ以外で分割してしまったのが原因。
でもって、PHP の docker image 側のイシューはほんの少し動きがあった
craftcms 側では、PHP の本流側の対応を待とうということになった。
本流側に下記のような 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
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 関数を使いましょう。
その他にも GMP なども使うことができます。
数値計算は、小数点が絡むときは要注意です。
Type intersection not working with traits · Issue #8941 · php/php-src
Trait が 交差型で使えないというイシュー
Trait は型ではないので、使えない。
じゃあ、特定の Trait を使っているクラスのみ許可する場合はどうしたらいいんだよ?という質問者への回答として
Marker interface を使ったら?という提案
これは、Trait を利用するクラスは、約束として、そのTraitの利用を表す Interface を implement することで、表現している。
これと似たようなことを Trait のみでもできるようにする提案は過去にされていた
単一継承を補う解決策としての trait に、色んな提案がされているが、あまり進展はしていない。
Discussion