2016-11-24 2 views
0

나는이 줄을 건너 온 : PHP 목록() 정의되지 않은 동작

list($diff, $current, $concurrent) = $diff; 

Documentation

이 정의되지 않은 동작이 발생할해야한다고 주장한다. 이 동작의 가능한 변형은 무엇입니까? Variable $ diff는 가변 내용을 가진 3 개의 요소를 포함하는 배열입니다.

이 줄은 버그가있는 응용 프로그램의 일부이며이 줄의 제작자는 사용할 수 없습니다. 내가 찾던 것이 아니란 것을 거의 확신하지만 100 % 확신하는 것이 좋을 것입니다. FPM/FastCGI로 PHP 5.6.25를 사용하고 있습니다. 미리 감사드립니다. documentation for list()로서

+0

애플리케이션 코드를 편집 할 수 있습니까? 그렇다면'$ array = $ diff; list ($ diff, $ current, $ concurrent) = $ array;'는 정의되지 않은 동작을 제거합니다. – Steve

+0

이유가 없으므로 정의되지 않았으므로 버전/운영 체제 등에 따라 다른 결과가 발생할 수 있습니다. 평가 중에 '$ diff'로 덮어 쓰게됩니다. @Steve가 제안한 것을 수행하거나'list ($ diff ...'변수가 도움이 될 것입니다.) –

+0

2 downvotes 대신 내 질문을 개선하는 데 대한 2 개의 의견이 더 있으면 좋을 것 같네 – svgrafov

답변

1

또한 상태 :

PHP 5에서,리스트()는 가장 오른쪽 파라미터로 시작 값을 할당한다. PHP 7에서 list()는 가장 왼쪽의 매개 변수로 시작합니다.

즉,이 행은 양측에 나타나는 변수 $diff이 할당 될 마지막 변수이기 때문에 PHP 5에서 의도 한대로 작동 할 수 있습니다. 그러나 PHP 7에서는 $diff 변수가 먼저 할당되므로 $diff은 이미 $current$concurrent에 대한 할당이 완료 될 때까지 변경되었습니다.

일반적으로 정의되지 않은 동작에 대한 힌트는 변수가 = 부호 양쪽에 나타나는 경우 예상 된 결과를 산출하기 위해 특정 할당에 의존 할 수 없다는 사실과 관련이 있다고 생각합니다. 문제의 해결 방법은 다음과 같습니다.

list($temp, $current, $concurrent) = $diff; 
$diff = $temp; 
unset($temp); 

이렇게하면 정의되지 않은 동작을 피할 수 있습니다.