PHP에서 end () 함수는 일반적으로 사용되는 배열 함수로 배열의 내부 포인터를 마지막 요소로 가리키고 해당 요소의 값을 반환합니다. 이 작업은 대부분의 배열을 처리하는 데 매우 유용합니다. 그러나 end () 함수를 사용하여 참조 배열을 조작 할 때 예상치 못한 부작용이 발생할 수 있습니다. 이 기사에서는 이것이 왜 발생하는지 설명하고 몇 가지 관련 사례를 제공합니다.
PHP에서 end () 함수의 구문은 매우 간단합니다.
mixed end ( array &$array )
$ 배열은 작동하려는 배열이며, end ()는 배열의 내부 포인터를 배열의 마지막 요소로 이동하고 해당 요소의 값을 반환합니다. end ()가 배열의 내부 포인터 위치를 변경한다는 점에 유의해야합니다. 즉, 다음에 current () , prev () , next () 및 기타 함수를 사용하면 새로운 내부 포인터 위치를 기반으로합니다.
문제는 일반적으로 참조 배열을 사용할 때 발생합니다. 참조 배열은 참조로 기능으로 전달되므로 배열에 대한 수정은 원래 배열의 내용에 영향을 미칩니다.
다음 코드 예제를 고려하십시오.
$array = [1, 2, 3, 4];
$refArray = &$array; // 참조를 사용하여 배열을 전달합니다
$lastElement = end($refArray); // 포인터를 마지막 요소로 이동하십시오
echo $lastElement; // 산출 4
echo $array[0]; // 산출 4
이 예에서 $ refarray는 $ array 에 대한 참조입니다. 따라서 end () 함수는 $ refarray 뿐만 아니라 원래 $ 배열 에도 영향을 미칩니다. end () 는 배열의 내부 포인터를 변경하기 때문에 $ 배열 의 첫 번째 요소가 배열의 마지막 요소, 즉 4가 됩니다. 이것은 부작용의 징후입니다.
이 부작용의 근본 원인은 PHP 배열의 내부 작업 메커니즘입니다. 참조 배열을 사용하면 PHP는 새 사본을 만들지 않지만 원래 배열에서 직접 작동합니다. 이는 배열의 포인터 상태 (즉, "현재 포인터 위치")가 공유됨을 의미합니다. 참조 배열에서 end ()을 호출하면 배열의 포인터가 마지막 요소로 이동하여 원래 배열의 위치에 영향을 미칩니다.
따라서 코드가 배열 포인터의 현재 위치 또는 배열 자체의 순서 (예 : 루프 트래버스 등)에 의존하는 경우 end () 함수 사용으로 인해 부작용을 유발할 수 있습니다.
이 부작용을 피하려면 원래 배열의 포인터 위치를 변경하지 않고 END () 함수를 사용할 수 있습니다. 이 문제를 피하는 몇 가지 방법이 있습니다.
배열의 사본을 사용하십시오.
배열 사본을 만들어 원래 배열을 직접 수정하지 마십시오. 예를 들어:
$array = [1, 2, 3, 4];
$arrayCopy = $array; // 배열 사본을 만듭니다
$lastElement = end($arrayCopy); // 원래 배열에 영향을 미치지 않습니다
echo $lastElement; // 산출 4
echo $array[0]; // 산출 1(원래 배열이 변경되지 않았습니다)
배열 포인터를 수동으로 재설정합니다.
배열의 포인터 위치를 변경 해야하는 경우 Reset () 함수를 사용하여 배열의 시작 부분으로 포인터를 재배치하여 후속 코드에 영향을 줄 위험이 줄어 듭니다. 예를 들어:
$array = [1, 2, 3, 4];
end($array); // 포인터를 끝으로 이동하십시오
reset($array); // 포인터를 시작으로 다시 재설정하십시오
echo current($array); // 산출 1
참조 배열 사용을 피하십시오.
배열을 참조하지 않고 배열 사본을 직접 전달하면이 포인터 공유 문제를 피할 수 있습니다. 예를 들어:
$array = [1, 2, 3, 4];
$lastElement = end($array); // 사본을 직접 전달하십시오,참조가 사용되지 않습니다
echo $lastElement; // 산출 4
echo $array[0]; // 산출 1(원래 배열이 변경되지 않았습니다)
end () 함수는 PHP에서 매우 유용한 도구이지만 참조 배열을 처리 할 때 예기치 않은 부작용을 유발할 수 있습니다. end () 는 배열의 내부 포인터 위치를 변경하므로 원래 배열의 후속 작업에 영향을 줄 수 있습니다. 따라서 end ()를 사용할 때는 특히 참조 배열을 사용할 때주의해야합니다. 배열 사본을 만들거나 배열 포인터를 재설정하거나 참조 된 배열의 사용을 피함으로써 이러한 부작용은 효과적으로 피하고 코드의 정확성과 예측 가능성을 보장 할 수 있습니다.