아래 예를 보세요.
코드 복사 코드는 다음과 같습니다.
$ array = array(1 ,2,3);
함수 추가(&$arr) {
$arr[] = 4
}
add(@$array)
print_r; ($array);
/**
현재 $array는 변경되지 않았습니다. 출력:
Array
(
[0] => 1
[1] => 2
[2] = >3
)
*/
add($array)
print_r($array)
/**
오류 억제가 없으면 출력은 정상입니다.
배열
(
[0] => 1
[1] => 2
[2] => ; 3
[3] => 4
)
*/
?> ;
저는 이 문제를 겪은 적이 없어서 먼저 관련 정보를 찾아보고 미리 준비된 답변이 있는지 확인했습니다. PHP와 유사한 버그 :http://bugs.php.net/bug.php?id=47623, PHP 관계자는 아직까지 해결하지 못하고 답변도 하지 않았습니다.
그 밖에는 없습니다. 오류 억제의 원리는 기사에 소개되어 있습니다(PHP의 오류 억제 원리 및 내장 HTML에 대한 심층적인 이해). 원칙적으로 오류 억제는 수준만 수정합니다. error_reporting이며 논리적으로 말하면 호출 메커니즘은 현장에서만 테스트할 수 있습니다.
gdb로 추적한 결과 잘못된 이식 문자를 사용한 후에 발견되었습니다. 함수 호출 전의 매개변수 opcode가 다릅니다:
코드 복사 코드는 다음과 같습니다:
// 오류 억제기가 사용되지 않음
OPCODE = SEND_REF
//에러 억제기가 사용된 후
OPCODE = SEND_VAR_NO_RE
코드 복사 코드는 다음과 같습니다.
expr_without_variable:
//...with omission
| '@' { zend_do_begin_silence(&$1 TSRMLS_CC) }
expr { zend_do_end_silence(&$1 TSRMLS_CC); $$ = $3; }
//ZEND_SEND_VAL 분기가 여기에서 사라졌습니다
non_empty_function_call_parameter_list:
expr_without_variable { ... .} //이 분기로 잘못 이동했습니다
| 변수 {..... } //정상적인 상황
위 내용을 포함하여 PHP 오류 억제기@에서 참조 매개변수 전송 실패를 일으키는 버그에 대한 분석을 소개합니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.