PHP를 쓴 지 여러 해가 지났지만 여전히 낮은 수준의 오류를 범할 수 있습니다. 오늘날 foreach에서 변수를 인용할 때 PHP 버전은 5.6.12입니다. 코드는 다음과 같습니다.
<?php
$arr = ['a', 'b', 'c', 'd', 'e'];
foreach ($arr as $i=>&$a) {
$a = $a.'_'. $a;
echo $a .'<br>';
}
echo '<hr>';
foreach ($arr as $i=>$a) {
echo $a .'<br>';
}
echo '<hr>';
print_r($arr);
출력 결과:
처음엔 두 번째 포리치 출력 결과를 보고 어처구니없었는데, 어떻게 d_d를 두 개 출력할 수 있었을까?
곰곰이 생각해 보니, 원래 PHP foreach에서 $a의 작용역은 전체 함수의 국소 변수이기 때문에 순환하고 있었다.순환에 갇힌 것이 아니라 외부가 여전히 유효하다.
따라서 두 번째 foreach를 실행할 때 $a는 새로운 변수가 아니라 $arr 배열 5를 가리킵니다.개별 요소의 주소 참조,
두 번째 foreach가 순환할 때 실제로 $arr 배열의 다섯 번째 요소에 끊임없이 값을 부여한다.
구체적인 부가의 경우,
첫 번째: a_a는 다섯 번째 요소에 할당되며, 결과는 [a_a, b_b, c_c, d_d, a_a]입니다.]
두 번째: b_b는 다섯 번째 요소에 할당됩니다. 결과는 다음과 같습니다. [a_a, b_b, c_c, d_d, b_b]
세 번째: c_c는 다섯 번째 요소에 할당됩니다. 결과는 [a_a, b_b, c_c, d_d, c_c]
네 번째: d_d는 다섯 번째 요소에 할당되며 결과는 [a_a, b_b, c_c, d_d, d_d]입니다.
다섯 번째: 다섯 번째 요소가 d_d가 되었기 때문에 다섯 번째 요소에 d_d를 다시 할당했습니다. 결과는 다음과 같습니다. [a_a, b_b, c_c, d_d, d_d]
해결 방법:
동일한 순환 변수 이름을 사용하지 않도록 합니다.
매번 다 쓰거나 다시 사용하기 전에 unset($a); 처리, 주소 적용 해제
위의 코드 예제를 사용할지 여부:
$arr = ['a', 'b', 'c', 'd', 'e'];
foreach ($arr as $i=>&$a) {
$a = $a.'_'. $a;
echo $a .'<br>';
}
echo '<hr>';
echo $a;
echo '<hr>';
//여기 unset 떨어져요
unset($a);
echo $a = 'ccc';
echo '<hr>';
print_r($arr);
echo '<hr>';
foreach ($arr as $i=>$a) {
echo $a .'<br>';
}
echo '<hr>';
print_r($arr);
출력 결과:
이제 정상입니다, 이런 사소한 부분들은 반드시 주의해야 합니다
'개발 꿀팁 > PHP' 카테고리의 다른 글
php 캐시 팁 (0) | 2022.08.03 |
---|---|
PHP는 재귀적인 무한 등급 분류를 사용하지 않는다 (0) | 2022.08.02 |
PHPStorm PSR-4 네임스페이스 접두사 추가 (0) | 2022.08.02 |
PHP5.6 CURL을 통해 사진 업로드 @ 부호가 올바르지 않은 호환성 문제 (0) | 2022.08.02 |
php 파일 업로드 이미지 형식이 이미지인지 여부 판단 (0) | 2022.08.02 |