"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > PHP에서 속성 기본값 함수 호출이 불가능한 이유는 무엇입니까?

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

2024-11-06에 게시됨
검색:285

Why Can\'t Attribute Defaults Function Calls in PHP?

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

[문제]

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

class Foo {
    public $path = array(
        realpath(".")
    );
}

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

$path = array(
    realpath(".")
);

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

[답변]

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

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

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

따라서 $path와 같은 변수 값을 할당하려면 예상 값이 정적 스칼라와 일치해야 합니다. 여기에는 정적 스칼라이기도 한 값이 있는 배열이 포함됩니다.

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가 예상되지 않는 경우(예: 함수 또는 메서드 관련) 오류가 발생합니다.

비정적 배열 허용 zend_do_early_bound()를 방해하는 INIT_ARRAY opcode를 생성합니다:

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

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

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

릴리스 선언문 이 글은 1729168219에서 재인쇄되었습니다. 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3