[문제]
이전 프로그래밍 경험에도 불구하고 초보자 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에는 없는 기능으로 남아 있습니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3