카테고리 보관물: 개발

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

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();

 

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