PHP 8.0에서 8.1로 마이그레이션중 Usage of static Variables in Inherited Methods 변화로 오류가 발생했다.
class A_Class { public static function foo() { static $num = 0; return ++$num; } } class B_Class extends A_Class { } echo A_Class::foo(); // 출력 1 echo B_Class::foo(); // PHP 8.0: 출력 1, PHP 8.1: 출력 2
위 코드에서 정적 변수 $num을 PHP 8.1에서는 부모 클래스와 자식 클래스가 서로 공유한다.
그래서 아래의 코드와 같이 정적 변수를 배열로 만들어 각 클래스별로 값을 저장하도록 수정했다.
class A_Class { public static function foo() { static $num_by_class = []; $num_by_class[static::class] ??= 0; $num = &$num_by_class[static::class]; return ++$num; } } class B_Class extends A_Class { } echo A_Class::foo(); echo B_Class::foo();