PHP8.1でのstatic変数の挙動が変わってる

しれっとこのタイミング大きな変更入れてきてる

関数内にstaticで変数を宣言する場合が影響受ける。

従来通りの挙動に近くするにはprotected static $member_counterのようなスタティックなメンバ変数を定義してそれを
static::$member_counterという風にアクセスすればよい(self::だとダメ)

<?php

class A {
    protected static $member_counter = 0;
    public static function counter() {
        static $counter = 0;
        $counter++;
        return $counter;
    }
    public static function member_counter(){
        static::$member_counter++;
        return static::$member_counter;
    }
}
class B extends A {
    protected static $member_counter = 0;
}
var_dump(A::counter()); // int(1)
var_dump(A::counter()); // int(2)
var_dump(B::counter()); // int(3), previously int(1)
var_dump(B::counter()); // int(4), previously int(2)
echo '======================='.PHP_EOL;
var_dump(A::member_counter()); // int(1)
var_dump(A::member_counter()); // int(2)
var_dump(B::member_counter()); // int(1)
var_dump(B::member_counter()); // int(2)

実行例

https://3v4l.org/aWqn0

参考

https://www.php.net/manual/en/migration81.incompatible.php

カテゴリー: php

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です