PHP foreach에서 참조 변수를 사용할 때의 함정에 대한 간략한 토론

高洛峰
풀어 주다: 2023-03-04 15:00:02
원래의
1339명이 탐색했습니다.

저는 오랫동안 PHP를 작성해왔지만 여전히 어리석은 실수를 저지릅니다. 오늘은 foreach에서 변수를 참조할 때 함정에 빠졌습니다. 코드는 다음과 같습니다.

<?php
$arr = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;, &#39;e&#39;];
foreach ($arr as $i=>&$a) {
  $a = $a.&#39;_&#39;. $a;
  echo $a .&#39;<br>&#39;;
}
echo &#39;<hr>&#39;;
foreach ($arr as $i=>$a) {
  echo $a .&#39;<br>&#39;;
}
echo &#39;<hr>&#39;;
print_r($arr);
로그인 후 복사

출력 결과

PHP foreach에서 참조 변수를 사용할 때의 함정에 대한 간략한 토론

처음 두 번째 foreach의 출력 결과를 봤을 때 어떻게 두 개의 d_d가 출력될 수 있을까?

잘 생각해 보니 PHP foreach에서 $a의 범위는 전체 함수의 로컬 변수이기 때문에 루프 내에 포함되지 않고 루프 외부에서도 여전히 유효한 것으로 나타났습니다.

따라서 두 번째 foreach가 실행될 때 $a는 새로운 변수가 아니지만 여전히 $arr 배열의 다섯 번째 요소에 대한 주소 참조를 가리킵니다.

두 번째 foreach가 다음과 같은 경우. 루프를 반복하면 실제로는 $arr 배열의 5번째 요소에 지속적으로 값을 할당합니다.

구체적인 할당 상황은

처음: a_a가 5번째 요소에 할당되고, 결과는 다음과 같습니다: [a_a, b_b, c_c, d_d,a_a]

두 번째: b_b가 다섯 번째 요소에 할당되고 결과는 다음과 같습니다: [a_a, b_b, c_c, d_d,b_b]

세 번째 경우: c_c가 5번째 요소에 할당되고 결과는 다음과 같습니다. [a_a, b_b, c_c, d_d,c_c]

네 번째 경우: d_d가 5번째 요소에 할당되고, 결과는 [a_a, b_b, c_c, d_d, d_d]

다섯 번째 : 이때 다섯 번째 요소가 d_d가 되었기 때문에 d_d는 다시 다섯 번째 요소에 대입되어 결과는 다음과 같습니다. still: [a_a, b_b, c_c, d_d,d_d]

해결 방법:

1. 동일한 루프 변수 이름을 사용하지 마세요.

2. $a); 사용 후 또는 다시 사용하기 전에 주소 애플리케이션을 잠금 해제하세요

또는 위의 코드 예시를 사용하세요:

$arr = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;, &#39;e&#39;];
foreach ($arr as $i=>&$a) {
  $a = $a.&#39;_&#39;. $a;
  echo $a .&#39;<br>&#39;;
}
echo &#39;<hr>&#39;;
echo $a;
echo &#39;<hr>&#39;;
 
// 这里 unset 掉
unset($a);
 
echo $a = &#39;ccc&#39;;
echo &#39;<hr>&#39;;
print_r($arr);
echo &#39;<hr>&#39;;
foreach ($arr as $i=>$a) {
  echo $a .&#39;<br>&#39;;
}
echo &#39;<hr>&#39;;
print_r($arr);
로그인 후 복사

출력 결과:

PHP foreach에서 참조 변수를 사용할 때의 함정에 대한 간략한 토론

이제 정상입니다. 이러한 작은 세부 사항에 주의하세요

위는 PHP에서 foreach에서 참조 변수를 사용할 때의 함정에 대한 편집자의 간략한 논의입니다. PHP 중국어 웹사이트~

더 보기 PHP에서 foreach에서 참조 변수를 사용할 때의 함정에 대한 간략한 토론 관련 기사는 PHP 중국어 웹사이트에 주목하세요!

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