今週の PHP 2022/08/13 〜 2022/08/19
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
Improved responses to different requests on static resources in built-in
web server
Implement FR #76935: OpenSSL chacha20-poly1305 AEAD support
Add openssl_cipher_key_length function
Add FILTER_FLAG_NO_SCIENTIFIC to FILTER_VALIDATE_FLOAT
StreamWrapper support for glob()
イシューで出てきていましたが、glob関数がStreamWrapperをサポートしてないという件。
RFC からの機能追加提案となりました。
is_json の実装
基本的な json_decode とほぼ同じです。php_json_yyparse
が成功したら、早期 return しているイメージ
Strict properties and unserialization
PHP 8.2 で導入される予定の、動的プロパティの非推奨化について。
unserialization のときの挙動が定義されていないという問題について話し合われています。
下記のコードは、存在するクラスの selialize された結果になるものを unserialize することで、動的プロパティの生成に成功しています。
さて、この状況はどうしましょうか?という話し合いが行われています。
- とりあえず放置して、課題として残す
- RCが出るまでになんとかする
こんなフラグを立ててみてはどうかという実装例がこちら。
Executing PHP SAPI/runtime from Golang/Rust
Go のような 並列性を持つフロントで、PHP をさばくようなランタイムを作りたいというお便り。
それは RoadRunner ではないのか?というコメント
すでに PHP nいは、 Swoole, Amp, React などの非同期、並列のソリューションがある。これらのソリューションがメジャーになってないのは、ソリューションとしてまだ若いから。(言語自体と比べて)
PHP の大きなアドバンテージは、既存ソフトウェアのエコシステムとの親和性。もしこれらを安全に非同期で動作させるなら、かなりの修正が必要になる。
PHP の "Shared Nothing" モデルを前提としているから。
PHPは、言語自体は非同期・並列を前提として作られていない。もし、非同期・並列を必要とするのであれば、そもそも言語自体をスイッチしたほうが良いのでは?というコメント
User-defined object comparison についてのディスカッション
これって、なんで否決されたの?おれ、仕事で結構必要なんだけど?という質問。
RFC を出した人の回答
- 議論がなされることなく vote フェーズに突入してしまった。
- comparator は、常に外部になければならないという反対意見が多かった
RFC を出した人としては、オブジェクト自身が自身がどのように比較されるのかをしっていることは、他の言語においても普通。
なので、このアイデアは良かったと思っている。と回答している。
これ、もう一回 RFC チャレンジしたら、イケそうな気がする。
Defining objects as constants
8.1 からオブジェクトを定数として定義可能になっているという話
class Item
{
}
define('ITEM', new Item());
new in initializer の副作用らしい
これをうまく利用すると、ENUMケースも定数として定義できるという。これつかえるじゃん!
enum DayOfWeek
{
case MONDAY;
case TUESDAY;
case WEDNESDAY;
case THURSDAY;
case FRIDAY;
case SATURDAY;
case SUNDAY;
}
define('SCHEDULED_DAY', DayOfWeek::TUESDAY);
流用すると....
Backed Enum を const に設定することに成功した。
Bugs
Invalid Math calculation From PHP 8.0.0 · Issue #9331 · php/php-src
一見、ただの IEEE 754 ご案内案件かと思ったら、バージョンによって挙動が異なるというイシュー
しかし、やはり IEEE 754 ご案内にて終了。
小数点計算を行う場合は、精度を決めた上で BC Math を使いましょう。
mb_strimwidth segmentation fault when mb_strimwidth("あいうえお", 1, 3) in 8.2beta2 · Issue #9335 · php/php-src
てきめんさんから、mb_strimwidth の segV の報告
おそらく、関連イシュー?
Allow catching as ParseError "Non-abstract method C::foo() must contain a body" · Issue #9333 · php/php-src
PHP 7 以降から、 include したファイルのシンタックスエラーをキャッチ出来るようになっているが、具象クラス内のボディーの無いメソッドは無理というイシュー。
これを使っていない身としては、よく気づいたな〜というイシュー。コードの動的生成とかをやっていると気づきそう。
wish: alternative to "whitescreen of death" · Issue #9334 · php/php-src
PHP 名物のエラー発生時の白い画面。これの代替はなんかない?というイシュー
register_shutdown_function + error_get_last を使ってはどうか?という回答
でも、それだとシンタックスエラーなどで、register_shutdown_function
に到達する前だと、どうにもならん。
それでは、ProxyErrorOverride
proxy_intercept_errors
はどうか?という回答
json_decode() not compliant with RFC8259 · Issue #9342 · php/php-src
json_decode
が RFC8259 とコンパティビリティが無いぞというイシュー
<?php
var_dump( json_decode( null ) );
var_dump( json_decode( false ) );
var_dump( json_decode( true ) );
いやいや、RFC8259 はネイティブの型については言及していなくて、文字列についてだよ。というコメントにてクローズ。
PHP 8.2 readonly classes allow inheriting mutable properties from traits · Issue #9285 · php/php-src
trait を使うと mutable な property を readonly クラスに差し込めるというイシュー
将来性を考えると、readonly class を とりあえずエラーにしようぜということで、エラーにする PR が来てる
Retrieving an enum case by its name · Issue #9352 · php/php-src
enum Status: string {
case Todo = 'todo';
case InProgress = 'inprogress';
case InReview = 'inreview';
case Done = 'done';
}
こんな Backed Enum で、名前から case を取得するのを簡単にしたいというイシュー
できるよ〜、こんな感じという返信。イシュー主は、思ってたんと違うというコメント
上記のやり方だと、enum のケースは取れなかったので、工夫してみたら取れた
is_numeric() limitation · Issue #9311 · php/php-src
先週議論されていた is_numeric
で指数表現は弾きたいと言っていたイシュー
FILTER_FLAG_NO_SCIENTIFIC
というフラグを FILTER_VALIDATE_FLOAT
に追加しようぜという PR が出まして、8.2 に入れちゃおうという話になっています。
つまり、FILTER_FLAG_NO_SCIENTIFIC
が設定されている場合は、FILTER_VALIDATE_FLOAT
で 7E3
のような表現は、Float ではないと判断させようということです。
Internal側にも、この件についてのメールが飛んでいます。
opcache.consistency_checks > 0 causes segfaults in PHP >= 8.1.5 in fpm context · Issue #8065 · php/php-src
opcache.consistency_checks >0
の設定で、opacache のハッシュチェックに失敗し続けてメモリリークするというイシュー
まだ調査中ですが、8.1.5 よりも新しいバージョンで入り込んだ不具合のようです。
checksum の計算がおかしかったようで、修正が入っています。
Unify structure for ext/random's engine tests by TimWolla · Pull Request #9321 · php/php-src
ext-random のテストコードをの構造リファクタリング
着々と進んでいる!
Segmentation fault on script exit · Issue #9361 · php/php-src
8.1.9 において、PHP-CLI のスクリプト実行の exit
で Seg Fault が出るというイシュー
修正コミットを見ると (size_t)
のキャストが追加されている。
Zend memory manager の不具合で、ZEND_MM_CHENK_SIZE
を オーバーフローしてしまうということで発生しているということでした。
そのため、long になるようにキャストすることで、不具合が防げるようです。
Discussion