🥙

今週の PHP 2022/08/13 〜 2022/08/19

2022/08/20に公開

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

Internal

PHP 8.2.0 Beta 3 available for testing

ついに Beta 3 です。

Additional small features for 8.2

RFCを出すほどではないような小さいフィーチャーについての確認がされています。

Make libxml_set_external_entity_loader() return the previous loader
https://github.com/php/php-src/pull/7977

Improved responses to different requests on static resources in built-in
web server
https://github.com/php/php-src/pull/8215

Implement FR #76935: OpenSSL chacha20-poly1305 AEAD support
https://github.com/php/php-src/pull/9366

Add openssl_cipher_key_length function
https://github.com/php/php-src/pull/9368

Add FILTER_FLAG_NO_SCIENTIFIC to FILTER_VALIDATE_FLOAT
https://github.com/php/php-src/pull/9338

StreamWrapper support for glob()

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

イシューで出てきていましたが、glob関数がStreamWrapperをサポートしてないという件。

RFC からの機能追加提案となりました。

is_json の実装

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

基本的な json_decode とほぼ同じです。php_json_yyparse が成功したら、早期 return しているイメージ

Strict properties and unserialization

PHP 8.2 で導入される予定の、動的プロパティの非推奨化について。

unserialization のときの挙動が定義されていないという問題について話し合われています。

下記のコードは、存在するクラスの selialize された結果になるものを unserialize することで、動的プロパティの生成に成功しています。

https://3v4l.org/BLgSf/rfc#vgit.master_jit

さて、この状況はどうしましょうか?という話し合いが行われています。

  1. とりあえず放置して、課題として残す
  2. RCが出るまでになんとかする

こんなフラグを立ててみてはどうかという実装例がこちら。

https://github.com/php/php-src/commit/653e4ea1c57def2d5cd75b7da9e3943a841b7d6c

Executing PHP SAPI/runtime from Golang/Rust

Go のような 並列性を持つフロントで、PHP をさばくようなランタイムを作りたいというお便り。

それは RoadRunner ではないのか?というコメント

すでに PHP nいは、 Swoole, Amp, React などの非同期、並列のソリューションがある。これらのソリューションがメジャーになってないのは、ソリューションとしてまだ若いから。(言語自体と比べて)

PHP の大きなアドバンテージは、既存ソフトウェアのエコシステムとの親和性。もしこれらを安全に非同期で動作させるなら、かなりの修正が必要になる。
PHP の "Shared Nothing" モデルを前提としているから。

PHPは、言語自体は非同期・並列を前提として作られていない。もし、非同期・並列を必要とするのであれば、そもそも言語自体をスイッチしたほうが良いのでは?というコメント

User-defined object comparison についてのディスカッション

https://wiki.php.net/rfc/object-comparison

これって、なんで否決されたの?おれ、仕事で結構必要なんだけど?という質問。

RFC を出した人の回答

  • 議論がなされることなく vote フェーズに突入してしまった。
  • comparator は、常に外部になければならないという反対意見が多かった

RFC を出した人としては、オブジェクト自身が自身がどのように比較されるのかをしっていることは、他の言語においても普通。
なので、このアイデアは良かったと思っている。と回答している。

これ、もう一回 RFC チャレンジしたら、イケそうな気がする。

Defining objects as constants

8.1 からオブジェクトを定数として定義可能になっているという話

class Item
{

}

define('ITEM', new Item());

https://3v4l.org/UTcfO

new in initializer の副作用らしい

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

これをうまく利用すると、ENUMケースも定数として定義できるという。これつかえるじゃん!

enum DayOfWeek
{
    case MONDAY;
    case TUESDAY;
    case WEDNESDAY;
    case THURSDAY;
    case FRIDAY;
    case SATURDAY;
    case SUNDAY;
}
define('SCHEDULED_DAY', DayOfWeek::TUESDAY);

流用すると....

https://3v4l.org/iWR6d#v8.1.9

Backed Enum を const に設定することに成功した。

Bugs

Invalid Math calculation From PHP 8.0.0 · Issue #9331 · php/php-src

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

一見、ただの IEEE 754 ご案内案件かと思ったら、バージョンによって挙動が異なるというイシュー

https://3v4l.org/EBJRv

しかし、やはり IEEE 754 ご案内にて終了。

小数点計算を行う場合は、精度を決めた上で BC Math を使いましょう。

https://3v4l.org/7bt8M

mb_strimwidth segmentation fault when mb_strimwidth("あいうえお", 1, 3) in 8.2beta2 · Issue #9335 · php/php-src

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

てきめんさんから、mb_strimwidth の segV の報告

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

おそらく、関連イシュー?

Allow catching as ParseError "Non-abstract method C::foo() must contain a body" · Issue #9333 · php/php-src

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

PHP 7 以降から、 include したファイルのシンタックスエラーをキャッチ出来るようになっているが、具象クラス内のボディーの無いメソッドは無理というイシュー。

https://3v4l.org/YY0Wu

これを使っていない身としては、よく気づいたな〜というイシュー。コードの動的生成とかをやっていると気づきそう。

wish: alternative to "whitescreen of death" · Issue #9334 · php/php-src

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

PHP 名物のエラー発生時の白い画面。これの代替はなんかない?というイシュー

register_shutdown_function + error_get_last を使ってはどうか?という回答

https://3v4l.org/cE3Xn

でも、それだとシンタックスエラーなどで、register_shutdown_function に到達する前だと、どうにもならん。

それでは、ProxyErrorOverride proxy_intercept_errors はどうか?という回答

json_decode() not compliant with RFC8259 · Issue #9342 · php/php-src

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

https://datatracker.ietf.org/doc/rfc8259/

json_decode が RFC8259 とコンパティビリティが無いぞというイシュー

<?php
var_dump( json_decode( null ) );
var_dump( json_decode( false ) );
var_dump( json_decode( true ) );

いやいや、RFC8259 はネイティブの型については言及していなくて、文字列についてだよ。というコメントにてクローズ。

https://3v4l.org/h7pOa

PHP 8.2 readonly classes allow inheriting mutable properties from traits · Issue #9285 · php/php-src

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

trait を使うと mutable な property を readonly クラスに差し込めるというイシュー

将来性を考えると、readonly class を とりあえずエラーにしようぜということで、エラーにする PR が来てる

https://github.com/kocsismate/php-src/commit/688bae7c5e46abbd7102c98a80c76aff138669a7

Retrieving an enum case by its name · Issue #9352 · php/php-src

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

enum Status: string {
    case Todo = 'todo';
    case InProgress = 'inprogress';
    case InReview = 'inreview';
    case Done = 'done';
}

こんな Backed Enum で、名前から case を取得するのを簡単にしたいというイシュー

できるよ〜、こんな感じという返信。イシュー主は、思ってたんと違うというコメント

https://3v4l.org/Kbhll

上記のやり方だと、enum のケースは取れなかったので、工夫してみたら取れた

https://3v4l.org/8S493#v8.1.9

is_numeric() limitation · Issue #9311 · php/php-src

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

先週議論されていた is_numeric で指数表現は弾きたいと言っていたイシュー

FILTER_FLAG_NO_SCIENTIFIC というフラグを FILTER_VALIDATE_FLOAT に追加しようぜという PR が出まして、8.2 に入れちゃおうという話になっています。

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

つまり、FILTER_FLAG_NO_SCIENTIFIC が設定されている場合は、FILTER_VALIDATE_FLOAT7E3 のような表現は、Float ではないと判断させようということです。

Internal側にも、この件についてのメールが飛んでいます。
https://news-web.php.net/php.internals/118436

opcache.consistency_checks > 0 causes segfaults in PHP >= 8.1.5 in fpm context · Issue #8065 · php/php-src

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

opcache.consistency_checks >0 の設定で、opacache のハッシュチェックに失敗し続けてメモリリークするというイシュー
まだ調査中ですが、8.1.5 よりも新しいバージョンで入り込んだ不具合のようです。

checksum の計算がおかしかったようで、修正が入っています。

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

Unify structure for ext/random's engine tests by TimWolla · Pull Request #9321 · php/php-src

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

ext-random のテストコードをの構造リファクタリング

着々と進んでいる!

Segmentation fault on script exit · Issue #9361 · php/php-src

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

8.1.9 において、PHP-CLI のスクリプト実行の exit で Seg Fault が出るというイシュー

修正コミットを見ると (size_t) のキャストが追加されている。

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

Zend memory manager の不具合で、ZEND_MM_CHENK_SIZE を オーバーフローしてしまうということで発生しているということでした。
そのため、long になるようにキャストすることで、不具合が防げるようです。

Discussion