今週の PHP 2023-02-25 〜 2023-03-03
PHP のメーリングリストから、気になった情報をピックアップします。
Internal
RFC idea: array_*(Enum) - Externals
array_*
の関数が、文字列化可能なオブジェクトと、Enum を受け入れられるようにしたいという RFC の前相談。
<?php
Enum Role {
case Admin;
case User;
}
$allowedRoles = [Role::Admin];
$hasRoles = [Role::User, Role::Admin];
if(array_intersect($allowedRoles, $hasRoles)) {
// なんかする
}
このコードは、11行目でエラーになります。エラー内容は下記の通りです。
PHP Fatal error: Uncaught Error: Object of class Role could not be converted to string in /tmp/xxxx.php:11
array_intersect
の内部で、配列内の要素を文字列にキャストして比較しているのだと思います。(未確認)
これが Enum 使えるならば、確実に存在する型(Enum) に対するフィルター操作になるので、内部でのランタイムの不具合発生が、たしかに抑制されそうな気がします。
この辺、他の言語ではどうなってるのかなぁ。
[RFC] [Vote] Typed class constants - Externals
PHP: rfc:typed_class_constants
型付定数の RFC ですが、投票が開始されました。満場一致で可決されそうです。
Steal labelled break and continue from zig? - Externals
Zig の Label Break を PHP でも出来るんじゃない?というお便り
while ($i--) {
if ($i % 2) goto foo;
}
foo:
-こんな感じで、goto を使うことで、似たような構造を作れます。あ、あんまり好きじゃないかも。
PHP code refactoring (was: include cleanup) - Externals
include cleanup は RFC で否決されたのに PR がマージされているのは規約違反ではないか?というお便り。
RFC で却下されることと、特定の PR がマージされるか・しないかは、必ずしも連動していないです。BCブレークが発生しないと思われる修正がマージされること自体は良いのではと思うのですが、例によって Max さんは少し荒々しいこともありまして、あまり生産的でないコミュニケーションが行われてしまっています。
良くも悪くもにぎやかではありますが。
まあ、そんなこといったら mb_string のオーバーホールはどうなのよっていうね。
RFC: code optimizations - Externals
小さい改善は、RFC なくても出来るようにしようよという Max さんの RFC
現状、外野からみると分かりにくく思えるところではありますが.....
ぶっちゃけ、上の議論でおこった Max さんの怒りの RFC という気もします。
ただ、グレーであることで都合が良いこともあるよね。
Bugs
set_exception_handler must catch exceptions also when in shutdown · Issue #10695 · php/php-src
shutdown 時にも set_exception_handler
で指定したコールバックが実行されるべきだというイシューです。
ともかく、現状はそうなっていないのですが、register_shutdown_function
で設定された関数が実行されている状態自体が不安定な状態であるので、そこで例外ハンドラーを動かすべきなのか?というコメントが来ています。
この辺は、無限スタックコールが発生しそうな案件でもあるので、細かい挙動を把握しておきたいですね。
一応、マニュアルを眺めてみましたが、当該挙動については記載がなかったです。
https://www.php.net/manual/ja/function.set-exception-handler.php
https://www.php.net/manual/ja/function.register-shutdown-function
PHP crashes on Windows when an inexistent filename is executed · Issue #10692 · php/php-src
Windows の PHP 8.2 系で、存在しないファイルを実行しようとするクラッシュするというイシュー。
すでに修正がマージされています。ヌルポですね。
Lexing memory corruption · Issue #10634 · php/php-src
Lexer の不具合。
&
とパラメーターの間にコメントを書けるようにする対応で入った不具合のようです。
Allow comments between intersection types and by-ref params · php/php-src@f291d37
oss-fuzz によって検出されたということで、fuzz すごいな。
Actions: Canonicalize architecture names by zeriyoshi · Pull Request #10681 · php/php-src
zeriyoshi さんからのイシュー
Github Actions のジョブ名を正規化しようというもの
例えば
-
x32
->x86
- x64 ->
x86_64
いや、これまじで、脳が一瞬変換をかけるから、すごく応援したい。
こういう細かい認知不可軽減が効くので。
`TypeError` when the array passed to `array_sum` contains array references · Issue #10725 · php/php-src
<?php
$value = array(10, array(20), 30);
next($value[1]);
echo array_sum($value);
?>
next を使って、内部配列ポインターを進めた状態にすると、array_sum で TypeError が出るというイシュー
そういや、正しい array_sum っていう RFC 出てたけど、これ大丈夫か?
JIT: Fix SIGSEGV issue while running hyperf-skeleton by bjzhjing · Pull Request #10658 · php/php-src
JIT の SegV 問題の最終解決ではないかと言われている?PR
とはいえ、他にもエッジケースはあるのでしょうが、今まで報告されてきたケースは、これで修正されるようです。
PHP 8.1.16 segfaults on line 597 of sapi/apache2handler/sapi_apache2.c · Issue #10737 · php/php-src
Apache2 で PHP が SegV 出てるよという話ですが、 Apache のバージョン 2.5.0 以降で一定して出ているようなので、Apache mod-php 環境の方は要注意かもしれません。
続報を待ちましょう。
Discussion