今週の PHP 2023-11-18 〜 2023-11-24

2023/11/25に公開

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

Internal

リリース

8.3.0がリリースされました。

Ability to session_decode() in a stateless manner? - Externals

session_decode(string $data) はセッションとして保存されたデータを復号して $_SESSION に詰めてくれるという関数です。ただし、これにはアクティブなセッションが動作していることが前提です。

質問主の方は、 session_decode を使って特定のセッションのデータを解読したいのだけど、それをすると現在のセッションが上書きされてしまうので困るという話です。

現状では、session_startされてない場合には、session_decode を行うことが出来ないので、既存のセッション情報を一度変数に退避した上で、session_decodeを行って必要なデータを取得して、しかるのちに退避したセッション情報を戻せばできるねというコメントが来てます。

レガシーシステムにおいて求められる対応とのことなので、普段はあまり必要ない知識かもしれません。

[RFC] Add trim for multibyte function by youkidearitai · Pull Request #12459 · php/php-src

mb_trim がマージされたようでめでたい。これでバイトセーフなマルチバイト文字のトリムができるようになります。

これは8.3.2くらいで使えるようになるのかな。もしくは8.4なのか。

Report fatal error if JIT cannot be enabled due to a misconfiguration - Externals

JITの設定ミスがあった場合にfatalエラーを出すというPRについての議論スレッドです。まだコメントは来てないです。

PHP: rfc:change_the_edge_case_of_round

IEEE754案件です。浮動小数点演算にもかかわらず10進数のように扱われているため、他の言語や関数と挙動が異なっている round()を直しましょうというRFCが投票に入りました。

// これまでの挙動
var_dump(round(0.285, 2)); // float(0.29)
var_dump(round(0.28499999999999998, 2)); // float(0.29)

// 新しい挙動
var_dump(round(0.285, 2)); // float(0.28)
var_dump(round(0.28499999999999998, 2)); // float(0.28)

現状は可決ムードです。

Is it possible to add asynchronous loop call function ? - Externals

関数呼び出しの非同期ループをPHPに追加することは可能ですか?という相談。相談主の方はGolangのdeferのような機能が欲しいようです。(便利ですよね)

コメントにて、PHPの非同期系ライブラリーが紹介されています。

このあたりは、頻繁にいじってないとすぐに使い方忘れるので、たまには触っておかないと....

[RFC][Discussion] Why can constructors violate LSP? - Externals

PHPのコンストラクタはなぜリスコフの置換原則(LSP)に違反するのか?という相談。

継承されたメソッドは可視性を下げることはできない

駄目な例 - Fatal Error

<?php
class P {
    public function hello($name = 'world') 
    {
        echo "hello $name\n";
    }
}

class C extends P {
    private function hello($name = 'world') 
    {
        parent::hello($name);
        echo "goodbye $name\n";
    }
}

実行可能な例 - コンストラクタは可視性を下げられる

<?php

class P {
    public function __construct($name = 'waldo') 
    {
        echo "hello $name\n";
    }
}

class C extends P {
    private function __construct($name = 'world') 
    {
        parent::__construct($name);
        echo "goodbye $name\n";
    }
    
    public static function run()
    {
        $c = new C();
    }
}

C::run();

相談主の方は、これはLSP違反なので共変性を厳密にするためのRFCを提出したいということです。

自分はLSPについて、表面的な知識しかないので議論を眺めていますが、面白いですね。特にサラッと論文のリンクが飛んできたりするのは良いです。簡単にまとめると以下のような意見が出ています。

  • コンストラクタで異なるシグネチャが使えると便利(実際によく見る)
  • コンストラクタは特殊な実装なのでLSPに厳密に従っていなくてよい
  • 異なるシグネチャをコンストラクタで使いたいときは生成用の静的メソッドを使って避ける
  • Liskov と Wing も論文でコンストラクタを除外している
  • インターフェースを使えばコンストラクタの可視性を強制できる

Discussion