Looking for php Keywords? Try Ask4Keywords

PHP 참조로 전달


이렇게하면 원래 변수를 수정할 수있는 함수 또는 요소에 대한 참조로 변수를 전달할 수 있습니다.

참조를 통한 전달은 변수에만 국한되지 않고 다음을 참조로 전달할 수도 있습니다.

  • 새로운 문장, 예를 들어 foo(new SomeClass)
  • 함수에서 반환 된 참조

배열

"참조에 의한 전달" 의 일반적인 사용은 새 배열을 만들거나 네임 스페이스를 낭비하지 않고 배열 내의 초기 값을 수정하는 것입니다. 참조 전달은 변수 앞에 & => &$myElement 붙이는 것과 같이 간단합니다.

다음은 배열에서 요소를 사용하고 단순히 초기 값에 1을 더하는 예제입니다.

$arr = array(1, 2, 3, 4, 5);

foreach($arr as &$num) {
    $num++;
}

이제 $arr 내의 모든 요소를 ​​사용하면 참조가 증가함에 따라 원본 요소가 업데이트됩니다. 다음 방법으로 확인할 수 있습니다.

print_r($arr);

노트

루프 내에서 참조로 전달할 때주의해야합니다. 위의 루프가 끝나면 $num 여전히 배열의 마지막 요소에 대한 참조가 저장됩니다. 그것을 포스트 루프로 지정하면 마지막 배열 요소를 조작하게됩니다! 이것은 post-loop를 unset() 할 때 발생하지 않도록 보장 할 수 있습니다 :

$myArray = array(1, 2, 3, 4, 5);

foreach($myArray as &$num) {
   $num++;
}
unset($num);

위의 내용은 문제가 발생하지 않도록합니다. 이것과 관련된 문제의 예가이 질문에 StackOverflow에 있습니다.


기능들

참조로 전달하는 또 다른 일반적인 사용법은 함수 내에 있습니다. 원래 변수를 수정하는 것은 다음과 같이 간단합니다.

$var = 5;
// define
function add(&$var) {
    $var++;
}
// call
add($var);

원래 변수를 echo 하여 검증 할 수 있습니다.

echo $var;

아래에는 PHP 문서에서 언급 한 것처럼 함수에 대한 다양한 제한이 있습니다.

참고 : 함수 호출에는 참조 기호가 없습니다 (함수 정의에만 해당). 함수 정의만으로도 인수를 참조로 올바르게 전달할 수 있습니다. PHP 5.3.0부터 foo (& $ a);를 &를 사용하면 "call-time-by-reference"가 사용되지 않을 것이라는 경고 메시지가 나타납니다. 그리고 PHP 5.4.0에서, 참조에 의한 호출 - 시간 참조가 제거되었으므로 치명적인 오류가 발생합니다.