PHP 8.1에서 상속된 메서드에서 정적 변수 사용 문제

PHP 8.0에서 8.1로 마이그레이션중 Usage of static Variables in Inherited Methods 변화로 오류가 발생했다.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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
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
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에서는 부모 클래스와 자식 클래스가 서로 공유한다.

그래서 아래의 코드와 같이 정적 변수를 배열로 만들어 각 클래스별로 값을 저장하도록 수정했다.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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();
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();
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();

 

이 글은 개발 카테고리에 분류되었고 태그가 있으며 님에 의해 에 작성되었습니다.