>  기사  >  백엔드 개발  >  PHP에서 속성 기본값 함수 호출이 불가능한 이유는 무엇입니까?

PHP에서 속성 기본값 함수 호출이 불가능한 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-10-17 20:34:02296검색

Why Can't Attribute Defaults Function Calls in PHP?

PHP 속성 기본값에서 함수를 호출할 수 없습니다

[문제]

이전 프로그래밍 경험에도 불구하고 초보자 PHP에서는 속성 기본 오류로 인해 당황했습니다. 코드:

<code class="php">class Foo {
    public $path = array(
        realpath(".")
    );
}</code>

구문 오류가 발생합니다. 그러나 다음은 원활하게 작동합니다.

<code class="php">$path = array(
    realpath(".")
);</code>

질문이 생깁니다. 왜 속성 기본값에서 함수를 호출할 수 없나요? 이는 의도적인 것입니까, 아니면 구현상의 결함입니까?

[답변]

PHP 컴파일러 코드는 공식적인 근거는 없지만 이러한 제한이 의도적인 것임을 나타냅니다. 이 기능을 안정적으로 구현하는 것은 PHP의 현재 구현의 제한 사항에서 알 수 있듯이 특정 문제를 야기합니다.

컴파일러의 문법은 클래스 변수 선언을 다음과 같이 정의합니다.

class_variable_declaration:
      //...
      | T_VARIABLE '=' static_scalar //...
;

따라서 $와 같은 변수 값을 할당하려면 경로의 경우 예상 값은 정적 스칼라와 정렬되어야 합니다. 여기에는 정적 스칼라인 값이 있는 배열이 포함됩니다.

static_scalar: /* compile-time evaluated scalars */
      //...
      | T_ARRAY '(' static_array_pair_list ')' // ...
      //...
;

문법에서 코드 샘플과 일치하는 다음 구문을 허용하는 경우 스크립트에서 "잘못된 바인딩 유형" 오류가 발생합니다.

class_variable_declaration:
      //...
      | T_VARIABLE '=' T_ARRAY '(' array_pair_list ')' // ...
;

주어진 코드 샘플을 구문 분석하면 다음 단계가 나타납니다.

zend_do_begin_class_declaration() // Adds an opcode
array_init(), zend_do_add_static_array_element() // Do not create new opcodes, add array to class properties
zend_do_declare_property() // Declares the property
zend_do_early_binding() // Consumes the last opcode and evaluates it

opcode가 예상되지 않은 경우(예: 함수 또는 메서드 관련) 오류가 발생합니다.

비정적 배열을 허용하면 INIT_ARRAY opcode가 생성되어 zend_do_early_bound()가 중단됩니다.

DECLARE_CLASS   'Foo'
SEND_VAL        '.'
DO_FCALL        'realpath'
INIT_ARRAY

속성 기본값의 함수 호출을 수용하려면 클래스 변수 선언 범위에 지정된 새 opcode 배열이 필요합니다. 메소드 정의에. 그러나 이러한 평가 시기를 결정하는 것은 추가적인 문제를 야기합니다.

다른 동적 언어로 이 문제를 해결했지만 복잡성과 낮은 우선순위로 인해 PHP에는 없는 기능으로 남아 있습니다.

위 내용은 PHP에서 속성 기본값 함수 호출이 불가능한 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.