2019/07/25、PHP7.4.0ベータ1がリリースされました。
2019/08/08、PHP7.4.0ベータ2がリリースされました。
2019/08/22、PHP7.4.0ベータ4がリリースされました。
あれ?
ベータ3は何処?
internalでもベータ3飛ばされた?と聞かれていますが、「いや、PHPのバージョンスキップは誇りであり伝統なのだよ」とか返されています。
しかしPHP7.3でも7.2でも普通にベータ3は出ているので、何のことだかよくわかりません。
ただの冗談なのか?
PHP7.4.0は2019/07/22に仕様凍結され、それ以降は以降は基本的にバグ修正だけが行われています。
以下はPHP7.4.0ベータ4で修正されたバグの一部です。
Second file_put_contents in Shutdown hangs script
シャットダウン関数内でひとつのファイルに2回file_put_contentsするとハングするというバグ。
<?php
register_shutdown_function ('shutdown');
function shutdown () {
file_put_contents ('/tmp/test.txt', "shutdown 1 \n", FILE_APPEND | LOCK_EX);
file_put_contents ('/tmp/test.txt', "shutdown 2 \n", FILE_APPEND | LOCK_EX); // Process exited with code 137
var_dump(file_get_contents("/tmp/test.txt"));
exit;
}
7.4.0α3で混入したようです。
どんな原理で起こるのかさっぱりだけど、そもそも普通はこんな使い方しないから気付かないのも仕方ない気はする。
Broken file includes with user-defined stream filters
自作ストリームフィルタを通すとincludeで何故かシンタックスエラーが発生するというもの。
ベータ1とベータ2でだけ発生します。
原因はこのコミットで、自作ストリームフィルタを使うとphp_stream_statの値が正しくならないことがあるとかなんとか。
そしてどうやら原因をなおすのではなく対症療法をやったみたいなので、もしかしたら今後もまたうっかり何か起こるかもしれません。
fstat mode has unexpected value on PHP 7.4
↑に関連してなのかどうなのか、fstatがPHPバージョンによって異なる値を返してくるバグが発覚しました。
$handle = popen('echo 12', 'r');
$stats = fstat($handle);
var_dump($stats['mode']); // 7.3までは4096、7.4ベータ2では33206
ただ環境に依るようで、3v4lでは全部4480でした。つまり3v4lではバグが起こりません。
Casting a DateTime to array no longer returns its properties
DateTimeインスタンスを(array)
キャストすると何も出力しないバグ。
var_dump((array) new \Datetime('2000-01-01')); // 7.3までは[date, timezone_type, timezone]、7.4.0αは[]
いやー、さすがにこれはどうなんだよ。
しかしPHP内部で使うのであればクラスのままでいいし、外に出すならJSONだけどjson_encodeは正しく動くから、実用的に問題になるような状況はあまり思いつかないです。
と思いきやSymfonyが内部的に配列を使っているらしいです。
そうなると連鎖的にLaravelが死んでPHPが終焉を迎えるので、修正しないわけにはいかないですね。
Assertion failure in openssl_random_pseudo_bytes
openssl_random_pseudo_bytesに第二引数を渡すと死ぬ。
openssl_random_pseudo_bytes(4,$b);
Segmentation faultが発生します。
なんで。
diffが1文字なんだけど、うっかりゴミ'/'が残っていただけなのだろうか。
しかもこれPHP7.1あたりからあったみたいです。
Cannot "manually" unserialize class that is final and extends an internal one
より優れたシリアライズを提供するVarExporterなるSymfonyプラグインがあります。
ところが、これがPHP7.4で__serialize
/__unserialize
が追加されたせいで自力でのシリアライズ/デシリアライズが不可能になったとかなんとか。
具体的にはシリアライズにReflectionClass::newInstanceWithoutConstructorを使っていて、そのヘルプには"組み込みfinalクラスはReflectionClass::newInstanceWithoutConstructorできない"と書かれているのですが、実際は組み込みクラスをextendsしたfinalクラスもReflectionClass::newInstanceWithoutConstructorできないので詰んだ(dead-end)そうです。
どういう理屈なのかいまいちよくわからないのですが、Nikitaもよくわからないとか言ってて、そしてよくわからないまま解決していました。
Can't access OneDrive folder
ローカルのOneDriveフォルダにglobやscandir、file_get_contentsなどでファイルアクセスが全くできないというバグ。
かつて同じような問題があり修正されたのですが、Windows 10 May 2019 Updateによる仕様変更で再発したようです。
それにしても、たかだかファイルアクセスしたいだけなのにめちゃめちゃ大変だな。
今後の予定
2019/09/05にRC1、そして以後も2週間ごとにRCがリリースされ、正式版リリースは2019/11/28の予定です。
感想
発生すればクリティカルだけど、発生条件がややこしくて誰も気付かなかった、みたいなものが多いです。
また直近で発生したバグは、多くが別の変更に伴って発生したものです。
○○を高速化した → △△が発生した → △△を修正したら××が発生した、みたいなやつですね。
原因のひとつとしてソースコードの見通しが悪いという問題点があるのは間違いないので(あらゆるところで#ifdef
の嵐だ)、もっとすっきりした書き方にした方がいいのではないかと思ったりはします。
が、しかしここは言語開発の世界です。
読みやすさなどより速度のほうが遙かに重要だ、ということなのでしょう。