PHP에서 함수 호출 결과를 괄호로 묶으면 다음과 같이 결과의 의미가 변경될 수 있습니다. 코드:
<code class="php">function get_array() { return array(); } function foo() { // return reset(get_array()); // ^ error: "Only variables should be passed by reference" return reset((get_array())); // ^ OK } foo();</code>
이 수수께끼 같은 동작은 공식 문서에 명시적인 설명이 없기 때문에 개발자는 기본 메커니즘을 확신할 수 없습니다.
분석
이 동작을 이해하는 열쇠는 함수 호출 인수를 구문 분석하는 PHP 언어의 모호함에 있습니다. (get_array())처럼 함수 호출 주위에 괄호를 추가하면 PHP는 이를 함수 호출이 아닌 표현식으로 처리합니다. 변수(ZEND_SEND_VAR_NO_REF)를 전송하는 데 사용되는 opcode는 표현식과 비교하여 함수 호출에 대해 다른 동작을 갖기 때문에 이러한 구별은 매우 중요합니다.
비함수 호출 표현식이 발견되면 ZEND_SEND_VAR_NO_REF는 다음 검사를 수행합니다.
제공된 예에서 괄호 안의 함수 call((get_array()))는 두 조건을 모두 만족합니다:
그 결과 opcode는 "변수만 참조로 전달해야 합니다." 오류를 발생시키지 않고 진행됩니다. 그러나 이 동작은 버그로 간주되므로 프로덕션 코드에서 의존해서는 안 된다는 점에 유의하는 것이 중요합니다.
위 내용은 PHP에서 함수 호출을 괄호로 묶으면 참조 오류가 발생하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!