PHP 7이 출시되면서 많은 새로운 기능과 개선 사항으로 인해 성능과 가독성이 향상되었습니다. 그러나 정적 변수를 사용하는 경우 배열에 할당할 수 없는 문제가 발생할 수 있습니다. 이번 글에서는 이 문제와 해결 방법을 자세히 살펴보겠습니다.
PHP 7 이전에는 배열을 포함한 모든 유형의 값을 정적 변수에 저장할 수 있었습니다. 예:
function test() { static $arr = array('a', 'b', 'c'); print_r($arr); } test(); // 输出 ['a', 'b', 'c']
그러나 PHP 7에서 이 코드는 다음 오류를 발생시킵니다.
Fatal error: Constant expression contains invalid operations in /path/to/file.php on line 2
이는 PHP 7이 정적 변수를 초기화하는 방법에 대해 더 엄격한 제한을 적용하기 때문입니다. 이제 정적 변수를 초기화하는 데에는 상수만 사용할 수 있습니다.
하지만 왜 PHP 7에서는 배열을 사용하여 정적 변수를 초기화할 수 없나요? 이는 PHP 7에서는 정적 변수의 초기화가 런타임이 아닌 컴파일 타임에 수행되기 때문입니다. 즉, 컴파일 타임에 PHP는 배열의 길이와 요소의 값을 알지 못하므로 정적 변수의 초기 값을 결정할 수 없습니다. 즉, PHP에서는 정적 변수를 초기화하기 위해 명확한 상수가 필요하지만 배열은 상수가 아닙니다.
이 문제를 해결하려면 배열 대신 클래스 상수를 사용할 수 있습니다. 클래스 상수는 컴파일 타임에 구문 분석되고 평가되므로 정적 변수를 초기화하는 데 사용할 수 있습니다. 예:
class Test { const ARRAY = array('a', 'b', 'c'); public function test() { static $arr = self::ARRAY; print_r($arr); } } $test = new Test(); $test->test(); // 输出 ['a', 'b', 'c']
이 예에서는 ARRAY
라는 클래스 상수를 정의하고 이를 정적 변수 $arr
를 초기화하는 값으로 사용합니다. 클래스 상수는 객체가 아닌 클래스에 속하므로 self::
를 사용하여 클래스 상수를 참조합니다. ARRAY
的类常量,并将其用作初始化静态变量$arr
的值。我们使用self::
来引用类常量,因为它们属于类,而不是对象。
除了使用类常量外,我们还可以使用PHP 7引入的匿名类来初始化静态变量。匿名类是一种没有名称的类,可以在运行时被创建和实例化。它们通常用于创建简单的对象和闭包。
以下是一个使用匿名类初始化静态变量的例子:
function test() { static $arr; if (!isset($arr)) { $arr = (new class { public $items = array('a', 'b', 'c'); })->items; } print_r($arr); } test(); // 输出 ['a', 'b', 'c']
在这个例子中,我们使用一个匿名类来创建一个只有一个属性items
的对象。我们使用$arr
来存储这个对象的items
items
속성이 하나만 있는 개체를 만듭니다. $arr
를 사용하여 이 개체의 items
속성을 저장하고 이를 정적 변수의 초기 값으로 사용합니다. 익명 클래스는 런타임에 생성되므로 배열을 사용하여 정적 변수를 초기화할 수 있습니다. 🎜🎜요약하자면, PHP 7에서는 정적 변수를 초기화하는 방법에 대해 더 엄격한 제한이 있지만 클래스 상수와 익명 클래스를 사용하여 배열을 할당할 수 없는 문제를 해결할 수 있습니다. 이러한 기술은 정적 변수뿐만 아니라 일정한 초기 값이 필요한 다른 시나리오에도 적용됩니다. 🎜위 내용은 php7 정적 변수를 배열에 할당할 수 없는 경우 수행할 작업의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!