>백엔드 개발 >PHP 튜토리얼 >참조에 의한 전달(&)을 사용하는 PHP foreach가 배열 요소를 예기치 않게 변경하는 이유는 무엇입니까?

참조에 의한 전달(&)을 사용하는 PHP foreach가 배열 요소를 예기치 않게 변경하는 이유는 무엇입니까?

DDD
DDD원래의
2024-12-11 04:41:09412검색

Why does PHP's foreach with pass-by-reference (&) change array elements unexpectedly?

Foreach의 PHP 참조로 전달

PHP에서 변수는 일반 변수이거나 참조 변수일 수 있습니다. 변수의 참조를 다른 변수에 할당하면 후자는 참조 변수가 되어 본질적으로 원본과 동일한 메모리 위치에 바인딩됩니다. 이 동작은 참조별 전달 구문(&)과 함께 foreach 루프를 사용할 때 영향을 미칩니다.

다음 코드를 고려하세요.

$a = ['zero', 'one', 'two', 'three'];

foreach ($a as &$v) {

}

foreach ($a as $v) {
  echo $v . PHP_EOL;
}

이 코드의 출력은 다음과 같습니다.

zero one two two

왜 이런 일이 발생하나요?

첫 번째 foreach 루프에서 $a의 각 요소는 변수 $v에 대한 참조입니다. 즉, $v를 수정하면 $a의 해당 요소도 수정됩니다.

구체적으로 첫 번째 루프의 마지막 반복 중에 $v에 $a[3] 값이 할당됩니다(예: ' 삼'). 그러나 이 할당은 참조 관계를 생성하므로 $a[3]는 참조 변수가 됩니다(&를 사용하여 명시적으로 할당되지 않더라도).

두 번째 foreach 루프에서 $에 있는 요소의 값은 a가 인쇄됩니다. 그러나 $a[3]은 이제 참조 변수이므로 해당 값은 $v의 값에 따라 변경됩니다. 세 번째 반복에서 $v에 'two' 값이 할당되면 $a[3]도 'two'가 됩니다.

결과적으로 마지막 반복에서 $v(여전히 $a를 가리킴) [3]) 값은 'two'이고 'two'가 인쇄됩니다. 이는 직관적으로 예상할 수 있는 '3'을 인쇄하는 대신 마지막 반복에서 '2'가 반복되는 이유를 설명합니다.

위 내용은 참조에 의한 전달(&)을 사용하는 PHP foreach가 배열 요소를 예기치 않게 변경하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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