>  기사  >  백엔드 개발  >  PHP에서 함수 호출을 괄호로 묶으면 참조 오류가 발생하지 않는 이유는 무엇입니까?

PHP에서 함수 호출을 괄호로 묶으면 참조 오류가 발생하지 않는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-10-26 22:35:30166검색

Why Does Parenthesizing a Function Call in PHP Avoid a Reference Error?

PHP의 괄호 및 함수 호출 의미

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는 다음 검사를 수행합니다.

  1. 인수가 함수 호출이 아닙니다.
  2. 인수가 참조이거나 참조 카운트가 1입니다.

제공된 예에서 괄호 안의 함수 call((get_array()))는 두 조건을 모두 만족합니다:

  1. 추가 괄호로 인해 함수 호출로 인식되지 않습니다.
  2. 반환된 배열의 참조 카운트는 1입니다. 함수 호출 내에서만 참조되기 때문입니다.

그 결과 opcode는 "변수만 참조로 전달해야 합니다." 오류를 발생시키지 않고 진행됩니다. 그러나 이 동작은 버그로 간주되므로 프로덕션 코드에서 의존해서는 안 된다는 점에 유의하는 것이 중요합니다.

위 내용은 PHP에서 함수 호출을 괄호로 묶으면 참조 오류가 발생하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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