> 백엔드 개발 > PHP7 > php7 정적 변수를 배열에 할당할 수 없는 경우 수행할 작업

php7 정적 변수를 배열에 할당할 수 없는 경우 수행할 작업

PHPz
풀어 주다: 2023-04-23 09:34:39
원래의
1344명이 탐색했습니다.

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

클래스 상수를 사용하는 것 외에도 PHP 7에 도입된 익명 클래스를 사용하여 정적 변수를 초기화할 수도 있습니다. 익명 클래스는 런타임에 생성되고 인스턴스화될 수 있는 이름이 없는 클래스입니다. 일반적으로 간단한 개체와 클로저를 만드는 데 사용됩니다.

다음은 익명 클래스를 사용하여 정적 변수를 초기화하는 예입니다. 🎜rrreee🎜이 예에서는 익명 클래스를 사용하여 items 속성이 하나만 있는 개체를 만듭니다. $arr를 사용하여 이 개체의 items 속성을 ​​저장하고 이를 정적 변수의 초기 값으로 사용합니다. 익명 클래스는 런타임에 생성되므로 배열을 사용하여 정적 변수를 초기화할 수 있습니다. 🎜🎜요약하자면, PHP 7에서는 정적 변수를 초기화하는 방법에 대해 더 엄격한 제한이 있지만 클래스 상수와 익명 클래스를 사용하여 배열을 할당할 수 없는 문제를 해결할 수 있습니다. 이러한 기술은 정적 변수뿐만 아니라 일정한 초기 값이 필요한 다른 시나리오에도 적용됩니다. 🎜

위 내용은 php7 정적 변수를 배열에 할당할 수 없는 경우 수행할 작업의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿