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

Susan Sarandon
풀어 주다: 2024-10-30 22:38:30
원래의
877명이 탐색했습니다.

Why Does Wrapping a Function Call in Parentheses Avoid a Reference Error in PHP?

PHP의 모호한 함수 호출 동작: 숨겨진 뉘앙스 공개

PHP에서는 함수를 호출하고 그 결과를 캡슐화할 때 특이한 동작이 발생합니다. 괄호 안에. 겉보기에 무해해 보이는 이 작업은 결과의 해석을 변경하여 잠재적으로 예상치 못한 동작으로 이어질 수 있습니다.

다음 코드 조각을 고려하세요.

error_reporting(E_ALL | E_STRICT);

function get_array() {
   return array();
}

function foo() {
   return reset(get_array()); // Error: "Only variables should be passed by reference"

   return reset((get_array())); // Success
}

foo();
로그인 후 복사

첫 번째 변형에서는 다음의 결과를 할당하려고 시도합니다. Reset() 함수에 대한 get_array()는 참조로 전달된 변수여야 하므로 오류를 트리거합니다. 그러나 함수 호출을 괄호로 묶으면 스크립트가 성공적으로 실행됩니다.

기본 메커니즘에 대해 추측할 수도 있지만 문서를 철저히 조사해도 이 현상에 대한 명확한 설명을 제공할 수 없습니다.

PHP 문법의 복잡성을 더 깊이 조사하고 phc와 같은 도구를 사용하여 코드의 AST를 시각화한 결과 두 스니펫 모두 동일한 구문 분석 트리가 생성되는 것으로 나타났습니다. 이렇게 하면 동작에 영향을 미치는 구문 변경 가능성이 제거됩니다.

그러나 PHP opcode 구조를 면밀히 조사하면 ZEND_SEND_VAR_NO_REF opcode 내에 숨겨진 주의 사항이 드러납니다. 이 opcode는 인수가 함수 호출이 아니고 참조 카운트가 1인 경우 참조 오류가 발생하지 않도록 지시합니다.

foo()의 두 번째 변형에서는 함수 호출이 더 이상 인식되지 않습니다. 추가된 괄호에. 결과적으로 시스템은 인수를 expr_without_variable로 분류하고 SEND_VAR_NO_REF opcode를 시작합니다. 반환된 배열의 참조 횟수는 1이므로 변수로 적합한 것으로 간주되어 참조 오류를 피할 수 있습니다.

이 동작은 의도된 기능이 아닌 버그로 간주되어야 한다는 점에 유의하는 것이 중요합니다. . 이러한 불일치에 의존하면 예측할 수 없고 신뢰할 수 없는 코드가 발생할 수 있습니다.

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿