今週の PHP 2022/12/17 〜 2022/12/23
PHP のメーリングリストから、気になった情報をピックアップします。
Internal
[RFC] Unicode Text Processing - Externals
Text クラスを追加して、Unicode Text の扱いを今よりも便利にしようという提案です。
string と違って、Text クラスは、 __construct
の段階で、 UTF-8 であることが確定しているということのようです。
Text クラスは final になるようです。
Text クラスの内部では、 UTF-16 で文字を扱うということです。Java も確か同じやり方をしていましたね。
しかし、既存の string や mb_internal_encoding などとの絡みは一体どうなるのか?色々疑問が湧いてきます。
インターナルの反響は
- intl-extension と mbstring でよくない?
- Text クラスを使うということは、内部に格納された文字列が UTF-8 だあることが確定するということで、シンプルで良い
- PHP の内部に、さらに Type が増えるのではないか?コアへの負担が増えてしまう
- intl に個別実装が増えるよりも、公式で提供される方がよい!賛成!
- ICU をバンドルするつもり? -> そうではなく依存する形にする
- ICU に依存する形になるのは、PHP の今までの方針に反するのでは?
Text クラスの機能性自体へのコメントもありましたが、それよりも少し高位な意見として ICU をバンドルするか否か、ICU への依存を許すべきか否か?というところがポイントになってきそうです。
議論が白熱していて、大変良いですね。
[RFC] More Appropriate Date/Time Exceptions - Externals
もうちょっとちゃんとした例外を投げようという話です。誰も反対しないだろうと思ってましたが、あっという間に受理されました。
Error, Exception が細かく設定されています。BCブレークな変更はあんまりないので、もしかしたらこれは 8.3 に入る変更なのでしょうかね?
Bugs
.
by zonuexe · Pull Request #10123 · php/php-src
Fixed link to Zend License to https without trailing
たどさんの PR
-
http
のリンクをhttps
に修正 - リンクURLの文末からピリオドを除去
そして、誰も反応していない。
スキーマについては、リンク先が HSTS に対応しておけばいいかもしれんなとも思いましたが、文末ピリオドは純粋に取ったほうがいいなと思った。
Unserialized objects use significantly more memory than ones created with the normal constructor · Issue #10126 · php/php-src
アンシリアライズで復元されたオブジェクトが、通常のコンストラクタで生成されたオブジェクトよりも、非常に大きいメモリーサイズになるというイシュー
面白いのは __unserialize
を実装したクラスは、生成方法によらずメモリーサイズが一定だったということです。
オブジェクトの property を HashTable に保持するのが原因ではないか?という意見が出ています。通常利用では差し支えなさそうなレベルの差異ではありますが、面白そうなので最後までウォッチしたい案件。
mbstring: Do not stop when mbstring test faild by youkidearitai · Pull Request #10009 · php/php-src
てきめんさんの PR がマージされました。
mbstring 系テストで失敗時に止まらないようにするという提案でした。
これで、mbstring オーバーホールの影響チェックが確認しやすくなります。
built-in webserver hangs on long URL · Issue #10129 · php/php-src
built-in webserver がハングしてしまうのだがというご相談です。
これについては、デフォルトで 1 worker しか動いていないため、内部で複数リクエストを発生させるようなケースではブロックされてしまい動きません。
PHP_CLI_SERVER_WORKERS
という環境変数があるので、これを使えば複数リクエストをさばけるようになります。
悪い大人は、これを使って本番で動かしたりもするようです。悪いなぁ。
Zend/tests/traits/constant_016.phpt failed · Issue #10133 · php/php-src
PHP 8.2 で constants in trait のテストがコケているという報告
remi さんが一撃で直して去っていきました。カッコイイ。
Non-suspended generators in suspended Fiber do not participate in GC · Issue #10134 · php/php-src
suspend された Fiber 内の suspend されてない generator が GC に関与しないという不具合。
例によって、今の私のレベルではわかりかねるやつですが、停止・再開周りはとかくテストしづらいので不具合が多そう。
[Feature request] Add class cache syntax · Issue #10139 · php/php-src
cacheable
みたいなキーワードを使うことで、何度も発生する IO 処理や 演算処理をキャッシュしやすくしませんか?という RFC 提案用 イシュー
その用途であれば static property でもいいのでは?というコメントに thumbs down して close して去っていった
final class OrderStatus {
private static array $labels = [];
public function getStatusLabel(int $statusCode): string {
return self::$labels[$statusCode] ??= $this->loadStatusLabel($statusCode);
}
private function loadStatusLabel(int $statusCode): string {
return "Status: {$statusCode}";
}
}
ところで、その用途であれば、キャッシュというよりメモ化だねというコメントもありました。
Performance optimization for mb_stripos and mitigation for GH-9613 by alexdowad · Pull Request #10107 · php/php-src
mb_stripos
のパフォーマンス改善イシューですが、てきめんさんがナチュラルにメンションされててすごい。
修正内容を見ると、文字化けしている箇所を 16進表記にしたりなど、細かい改善がされていますね。
Custom properties of DateTimeImmutable child classes are not serialized · Issue #10152 · php/php-src
DateTimeImmutable クラスを継承した独自クラスを作成して、 serialize -> unserialize すると、独自定義のプロパティが消え去るというイシュー。
まじかよ?って思ったけど、マジだった。
原因となっているコミットはこれ https://github.com/php/php-src/pull/8422
ようするに、独自のシリアライズ用メソッドが追加されたせいで、通常のシリアライズが行われなくなって、抜け漏れがあったということらしいです。
作者自身から不具合であるという投稿があるので、そのうち直りそう。
こういうのを避けるためにもデコレーターみたいな使い方したほうが良いですね。直接継承って、そもそもあんまり好きじゃない。
GMP Objects should disallow invoking constructor like other opaque objects · Issue #10155 · php/php-src
GMP のオブジェクトは、コンストラクターから生成されるべきではないというイシュー
Opaque Object という表現があります。不明瞭なオブジェクト??日本語だと何にあたるのだろう。
いずれにしろ gmp_init
を使って正しく生成されることを矯正したいのであれば、このイシューは正しい。
でもって、 Verified
されたので、GMP のオブジェクト生成について、何がしかの変更がなされそう。
インターナルでも議論されています。https://externals.io/message/119216
あまり盛り上がってはいない。
そして、constructor 廃止ではなく、正しい constructor を実装しようという話に落ち着きました。
- こちらで廃止のPRが作られたけど https://github.com/php/php-src/pull/10158
- 後方互換性を考慮して、こっちになりました。 https://github.com/php/php-src/pull/10225
ちなみに GMP は GNU MP の略です。めっちゃでかい数が使えます。(語彙力)
DateTime->diff() error · Issue #10163 · php/php-src
異なる Timezone を指定して diff を取るとおかしいという話。この辺の時間の実装は、PHP ではよく不具合として上がってきています。
アプリの国際化の話だと、データベースにタイムゾーン付きで日付を突っ込んでおけば大丈夫という話をよく聞きますが、ソフトウェア側で不具合があることも考えると、安全に倒した実装方針を考える必要がありそう。
master では直っているようです。
同じ Timezone だったら timelib の関数による diff 。そうでない場合は、直接計算するようです。
Discussion