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
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에서는 부모 클래스와 자식 클래스가 서로 공유한다.
그래서 아래의 코드와 같이 정적 변수를 배열로 만들어 각 클래스별로 값을 저장하도록 수정했다.
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();