🐡

今週の PHP 2022/12/17 〜 2022/12/23

2023/01/15に公開

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

Internal

[RFC] Unicode Text Processing - Externals

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

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

もうちょっとちゃんとした例外を投げようという話です。誰も反対しないだろうと思ってましたが、あっという間に受理されました。

https://wiki.php.net/rfc/datetime-exceptions

Error, Exception が細かく設定されています。BCブレークな変更はあんまりないので、もしかしたらこれは 8.3 に入る変更なのでしょうかね?

Bugs

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

たどさんの PR

  • http のリンクを https に修正
  • リンクURLの文末からピリオドを除去

そして、誰も反応していない。

スキーマについては、リンク先が HSTS に対応しておけばいいかもしれんなとも思いましたが、文末ピリオドは純粋に取ったほうがいいなと思った。

Unserialized objects use significantly more memory than ones created with the normal constructor · Issue #10126 · php/php-src

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

アンシリアライズで復元されたオブジェクトが、通常のコンストラクタで生成されたオブジェクトよりも、非常に大きいメモリーサイズになるというイシュー

面白いのは __unserialize を実装したクラスは、生成方法によらずメモリーサイズが一定だったということです。

オブジェクトの property を HashTable に保持するのが原因ではないか?という意見が出ています。通常利用では差し支えなさそうなレベルの差異ではありますが、面白そうなので最後までウォッチしたい案件。

mbstring: Do not stop when mbstring test faild by youkidearitai · Pull Request #10009 · php/php-src

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

てきめんさんの PR がマージされました。
mbstring 系テストで失敗時に止まらないようにするという提案でした。

これで、mbstring オーバーホールの影響チェックが確認しやすくなります。

built-in webserver hangs on long URL · Issue #10129 · php/php-src

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

built-in webserver がハングしてしまうのだがというご相談です。
これについては、デフォルトで 1 worker しか動いていないため、内部で複数リクエストを発生させるようなケースではブロックされてしまい動きません。

PHP_CLI_SERVER_WORKERS という環境変数があるので、これを使えば複数リクエストをさばけるようになります。

悪い大人は、これを使って本番で動かしたりもするようです。悪いなぁ。

Zend/tests/traits/constant_016.phpt failed · Issue #10133 · php/php-src

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

PHP 8.2 で constants in trait のテストがコケているという報告

remi さんが一撃で直して去っていきました。カッコイイ。

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

Non-suspended generators in suspended Fiber do not participate in GC · Issue #10134 · php/php-src

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

suspend された Fiber 内の suspend されてない generator が GC に関与しないという不具合。
例によって、今の私のレベルではわかりかねるやつですが、停止・再開周りはとかくテストしづらいので不具合が多そう。

[Feature request] Add class cache syntax · Issue #10139 · php/php-src

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

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

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

mb_stripos のパフォーマンス改善イシューですが、てきめんさんがナチュラルにメンションされててすごい。

修正内容を見ると、文字化けしている箇所を 16進表記にしたりなど、細かい改善がされていますね。

Custom properties of DateTimeImmutable child classes are not serialized · Issue #10152 · php/php-src

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

DateTimeImmutable クラスを継承した独自クラスを作成して、 serialize -> unserialize すると、独自定義のプロパティが消え去るというイシュー。

まじかよ?って思ったけど、マジだった。

https://3v4l.org/8q4Or

原因となっているコミットはこれ https://github.com/php/php-src/pull/8422

ようするに、独自のシリアライズ用メソッドが追加されたせいで、通常のシリアライズが行われなくなって、抜け漏れがあったということらしいです。

作者自身から不具合であるという投稿があるので、そのうち直りそう。

こういうのを避けるためにもデコレーターみたいな使い方したほうが良いですね。直接継承って、そもそもあんまり好きじゃない。

GMP Objects should disallow invoking constructor like other opaque objects · Issue #10155 · php/php-src

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

GMP のオブジェクトは、コンストラクターから生成されるべきではないというイシュー

Opaque Object という表現があります。不明瞭なオブジェクト??日本語だと何にあたるのだろう。
いずれにしろ gmp_init を使って正しく生成されることを矯正したいのであれば、このイシューは正しい。

でもって、 Verified されたので、GMP のオブジェクト生成について、何がしかの変更がなされそう。

インターナルでも議論されています。https://externals.io/message/119216
あまり盛り上がってはいない。

そして、constructor 廃止ではなく、正しい constructor を実装しようという話に落ち着きました。

ちなみに GMP は GNU MP の略です。めっちゃでかい数が使えます。(語彙力)

DateTime->diff() error · Issue #10163 · php/php-src

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

異なる Timezone を指定して diff を取るとおかしいという話。この辺の時間の実装は、PHP ではよく不具合として上がってきています。

アプリの国際化の話だと、データベースにタイムゾーン付きで日付を突っ込んでおけば大丈夫という話をよく聞きますが、ソフトウェア側で不具合があることも考えると、安全に倒した実装方針を考える必要がありそう。

master では直っているようです。

https://github.com/php/php-src/commit/904933e9185664148ce5459f93726f54f572b6c3

同じ Timezone だったら timelib の関数による diff 。そうでない場合は、直接計算するようです。

Discussion