🙄

今週の PHP 2023-02-25 〜 2023-03-03

2023/03/08に公開

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

PHP: rfc:code_optimizations

現状、外野からみると分かりにくく思えるところではありますが.....
ぶっちゃけ、上の議論でおこった 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