📖

今週の PHP 2023-11-25 〜 2023-12-01

2023/12/07に公開
2

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

Internal

PHP: rfc:adding_bcround_bcfloor_bcceil_to_bcmath

bcround, bcfloor, bcceilをBCMathに追加するRFCですが、投票締め切りです。
13対0で受諾されました。

PHP: rfc:jit_config_defaults

JITの設定方法をわかりやすくしようというRFCが、投票フェーズに入りました。
受諾されそうな雰囲気です。

PHP: rfc:final_anonymous_classes

Final Anonymous ClassのRFCも投票フェーズにはいりました。
ちょっと会話が足りてなくないかい?って思ってましたが否決濃厚な雰囲気です。

[RFC] [VOTE] Change the edge case of round() - Externals

round関数のエッジケースの挙動修正について、投票にまつわるやり取りがされています。
概ね、「修正する挙動には賛成だけど、後方互換性を壊してしまうのでPHP9まで待ちたい。だからNOです。」という雰囲気が多いようです。現状はちょうど半分が賛成なので、否決されそうな雰囲気です。

Reproducible Builds - Externals

PHPソースコードの再現可能なビルドについての議論です。ソースコードの各所でDATE, TIMEといったビルド時刻を利用しているため、異なる時間にビルドすると、まったく同じビルドを行うことが出来ないというものです。

SOURCE_DATE_EPOCH を利用して、ビルド時点で利用されるDATE, TIMEを固定するという話がなされています。 git log -1 --pretty=%ct を設定したらどうかな?なんて話が出ています。

Inconsistency mbstring functions - Externals

mb_strpos, mb_substr では、内部で無効なバイトに遭遇した時の取り扱い方が違うという件についてのお便り。
Major Overhaul of mbstring の一連のやり取りで見たのは内部でUTF-8として扱うか、UTF-32に変換するかなどの処理方法の違いに起因するようです。

色々意見が交わされているのですが、まだ議論中です。

PHP Foundationへの寄付リンクをPHP websiteに追加しようという相談です。

PRはこれですね。https://github.com/php/web-php/pull/821

PHP GroupとPHP Foundationの2つの集団が存在していて、現在イニシアティブを取っているPHP Foundation側に統合するのが良さそうなどの意見も出ていて、ちょっと経緯を知らない自分なんかには理解が難しい話も出てました。

PRに対しては概ね好意的な雰囲気のようです。

What is the prevailing sentiment about extract() and compact() ? - Externals

extractとcompactについて、みんなどう思う?という相談。

extractは連想配列からキー名の変数を作ります。compactは逆で、変数から変数名をキーにした連想配列を作ります。要するに質問主さんは、これらの若干不明瞭な動きをする関数が将来的に廃止されていくのか?ということが気になっているようです。

概ね、まああんまり良くないよねというコメントが続いたあと、焼き払えという過激なコメントも来ていました。

Deprecate declare(encoding='...') + zend.multibyte + zend.script_encoding + zend.detect_unicode ? - Externals

下記の4つの設定項目を廃止しようぜ。だってもうみんなUTF-8じゃん?というお便り

  • declare(encoding='...')
  • zend.multibyte
  • zend.script_encoding
  • zend.detect_unicode.

まあ、これはマルチバイト界隈から反対が上がるよねと思ったら、てきめんさんも武田さんも出てきて面白かったです。

ちょっと昔のPHPでは、表示の文字コード、サーバーの文字コードなどを極めて慎重に調査した上で使うのが当たり前でした。今はUTF-8前提ですが、レガシーシステムには文字コードセンシティブなシステムが山ほど存在するはずなので、断固として反対していく必要がありますね。

Callable arguments cannot have default value - Externals

callableの引数にデフォルト値が設定できないよねというお便り。

質問主さんがやりたいことは、callable型にデフォルト値を設定したいというものです。下記は私が書いたコード例です。
https://3v4l.org/1S0jn

仮にcallableがstringを返すとしても、callable型に文字列をデフォルト値と設定することは出来ないので、このままでは無理ですね。

コメントでは\Closure|stringのunion型で受けて、is_callableで検査して、callableなら関数呼び出しすれば良いという意見が出てました。ちょっと、見た目があれだなとは思いますが、たしかにそれなら解決できる。

また、デフォルト値を第一級callableにすればよいのではという意見がでてました。私はこちらの解決策のほうが好きです。コード例は↓

https://3v4l.org/vaQu8

[PDO] 2 phase commit - Externals

PDOで2相コミットできるようにしようというお便り。異なる2つのDBに対して横断的にトランザクションをかけられるようにしたいという要望のようです。

データベーススペシャリスト試験で定番で出てくるやつですね。

データベーススペシャリスト平成28年春期問14 2相コミットの処理手順|データベーススペシャリスト.com

MySQL、PostgreSQL, Oracle のそれぞれに2相コミットのAPIがあるようです。(知らなかった)
コミュニティの反応としては、概ね好意的のようです。実際に、xDBなトランザクションがコア側で実装されれば、PHPに新たな奥の手が出来そうですね。

まあ、これを使うシステムはカオスになりそうだから、あんまり普通に仕事では使ってほしくないななどと思いましたが....

[PDO] I want to unify the behavior when changing the autocommit mode setting while a transaction is open. - Externals

トランザクション中にオートコミットのモードを変更したときの挙動を統一したいよね?というお便り

コード例は下記

$db = new PDO(/* omission */, [PDO::ATTR_ATUOCOMMIT => 0]);
$db->beginTransaction();
$db->setAttribute(PDO::ATTR_ATUOCOMMIT, 1);

PDOは完璧な抽象化レイヤーなので、実装が完全に一致するとは限らない。そこは無理して合わせられないよという意見がありました。

さらに、下記のRFCにあるとおり、DBMS固有の実装はサブクラスに実装しようというRFCがすでに通過しているので、こっちで実現したらどうか?というコメントがありました。確かに、スッキリ解決しそうな気がする。

PHP: rfc:pdo_driver_specific_subclasses

Discussion

おぎおぎ

Callable arguments cannot have default value - Externals
の以下の部分でTypo?かもです。

コメントでは closuse|string のunion型で受けて

closure