👌

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

2023/05/22に公開

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

Internal

Release Managers for PHP 8.3 - Externals

リリースマネージャー募集のお便り。何名か立候補されてますね。確か、やったことある人と初めての人の組み合わせという話だった気がする。

[RFC] Properties in interfaces - Externals

interface で property を定義できるようにしよう!というRFCの相談。
property名が競合したときにどうするのかな??

public なプロパティもインタフェースだよねという投稿者の意図は完全に理解できます。相談内では、PHP: rfc:property-hooksとの関連性について指摘されていますね。

現在進行系で仕様策定されているものに、合わせるのは大変そう。

Traits and redeclaring static properties - Externals

trait における static プロパティの再定義についてというお話。

とりあえず、通常の継承における static プロパティの場合。それぞれのクラスがそれぞれのプロパティを持ちます。

https://3v4l.org/Dll1m

static プロパティをtraitで宣言して、継承関係のそれぞれのクラスで使用した場合

https://3v4l.org/SClLn

compile time copy & paste だから、これは合理的だというコメントが入っていたけど、compile時にコピペされたのなら、継承時のstatic プロパティと挙動は一緒のほうが、合理的じゃないかなぁ。

これはソースを読んでみたい案件

https://github.com/php/php-src/pull/10937

Githubのイシューが出ていて、どうやら、これは対応されるっぽいです。でもって、結局、どっちが正しいのかよく分からなくなってきた。

Bugs

Static properties in traits don't override static properties from parent class · Issue #10935 · php/php-src

static なプロパティが trait ではオーバーライドされていないというイシュー

ご覧の通りで、継承時と挙動が異なります。これについては、trait の仕様策定時に定義されていなかったため、特に決まっていないというのが実情です。

Internal にも相談スレッドが出来ており、特に反対意見も無かったので、継承時の挙動に合わせることになりました。https://externals.io/message/119809

RFC ではなく、そのまま修正がマージされるようです。

Add AMPHP, ReactPHP, Revolt PHP in community job by arnaud-lb · Pull Request #10933 · php/php-src

Fiberを常用しているコミュニティのジョブを使って、Fiberをテストするようにしようというイシューです。まだ不安定なのでDraft扱いですが、実に良いことだなと思いました。

For UTF-7, emit error marker if Base64 section ends abruptly after first half of surrogate pair by alexdowad · Pull Request #10927 · php/php-src

pakutoma さんの ISO-2022-JP の PR 修正時に見つかったそうですが、サロゲートペア関連の細かい不具合修正です。UTF-7 ってそもそも使わないなと思いました...

UTF-7 - Wikipedia

7bitでユニコードを扱うための符号化スキームなのでした。知らなかった。

日本語メールの仕組み | SendGridブログ

なるほど、メールで日本語を使う場合にも利用可能なのですね、であれば ISO-2022-JP に付随して見つかるのは、納得です。

IntlDateFormatter returns wrong output for 1940 date in Amsterdam timezone · Issue #10898 · php/php-src

ext-intl を使った日付フォーマッタがアムステルダムのタイムゾーンで誤った結果を返すというもの。問題はPHPというよりは、ext-intl が依存しているICU4Cライブラリーということです。

Improved Bug Report for "header already sent" warning · Issue #10721 · php/php-src

session_start() を使おうとしたけど、header がすでに送信されているから無理だよというエラーメッセージですが、どこで送信したのか教えてくれよ!というイシュー

Note where a session was already started by NattyNarwhal · Pull Request #10736 · php/php-src
すでに修正がマージされています。

修正されたエラーメッセージはめちゃくちゃわかりやすいです。

Notice: session_start(): Ignoring session_start() because a session is already automatically active in %s on line %d

session が自動開始された場合にファイル名、行数を教えてくれます。超便利。

Match with && operator · Issue #10971 · php/php-src

Match 式が複合条件を適切に判断しないのは、なぜですか?という質問

質問者のサンプルコードはこちら https://3v4l.org/KktKB#v8.2.4

<?php

$result = match('test') {
    'test' && true => true,
    'test2' && true => true,
    default => false,
};

var_dump($result);

この結果は、false になります。

なんでや? 'test' だから、true でしょ?という質問。

結論から言うと、match 式の条件は、式としてそれ自体が評価されるので、上のコードは実質下記のようになります。

<?php

$result = match('test') {
    true => true,
    true => true,
    default => false,
};

var_dump($result);

PHP: match - Manual

知らなかったんですけど、制約式にtrue を入れると厳密じゃない比較が出来るんですね。

Unary minus const expression consistency by iluuu1994 · Pull Request #10978 · php/php-src

https://3v4l.org/BSeIT

-0.0 がconstでは float(0) と評価されてしまうという不具合。
すでに、PHP 8.2.6 以降では修正されています。

よく気づきますねというやーつ。詳しくないのですが、コメントには一貫性という記述があるので、数学的な話というよりはプログラムとして一貫性を持ちましょうという話だと理解しています。

Discussion