[문제]
이전 프로그래밍 경험에도 불구하고 초보자 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!