서로 다른 기사가 서로 다른 내용을 말하는 것처럼 보이는 이유는 서로 다른 종류의 참조별 전달에 대해 이야기하고 있기 때문입니다.
매개변수를 참조로 전달해야 하는지 결정하는 가장 중요한 것은 함수 서명 자체이며, 이에 대한 기본 사항은 PHP 4 이후로 변경되지 않았습니다.다음 예를 고려하십시오.
function foo( $by_value, &$by_reference ) { /* ... */ }
$a = 1; $b = 2;
foo( $a, $b );
여기서 외부변수는 $a
마치 다음과 같이 할당되는 것처럼 값으로 함수에 전달됩니다. $by_value = $a;
- 변경 사항 $by_value
영향을 미칠 수 없다 $a
.변수 $b
그러나 통과되고있다 참고로;양식의 할당과 마찬가지로 $by_reference =& $b;
이는 두 개의 이름으로 참조되는 하나의 변수가 있다는 것을 의미하며, 하나에 대한 할당은 둘 다에 대한 할당으로 작동합니다.
"일반" 값(문자열, 숫자 또는 배열)을 값으로 전달하면 해당 값이 새 변수에 복사됩니다. PHP 5부터:그러나 객체를 값으로 전달하면 약간 다른 일이 발생합니다. 복사된 "값"은 동일한 객체에 대한 포인터일 뿐입니다.이는 다음을 의미합니다. $a
객체였습니다. 호출할 수 있습니다. $by_value->some_property = 42;
그리고 $a->some_property
또한 그럴 것이다 42
.그러나 새로운 값을 할당한 경우 $by_value
, 여전히 영향을 미치지 않습니다 $a
.
PHP 5.4까지, 있었다 추가의 참조 동작을 "강제"하기 위해 참조로 매개변수를 전달하는 방법 통화 시간에.이것은 당신이 쓸 수 있다는 것을 의미했습니다. foo(&$a, &$b);
변경 사항을 "캡처"합니다. $by_value
안에 foo()
기능.이에 의존하는 것은 일반적으로 나쁜 생각이므로 제거되었습니다.(PHP 6에서 제거될 예정이었기 때문에 5.4에 포함되었지만 해당 프로젝트는 5.3 및 5.4에 더 작은 변경 사항이 포함되어 무기한 보류되었습니다.)
마지막으로, 함수는 반품 참조에 의한 변수(예: 여기 매뉴얼에서 논의됨).실제로는 다음을 입력해야 하기 때문에 약간 까다롭습니다. &
~에 둘 장소:함수 선언의 시작 부분에 다음과 같이 말합니다. return
"이 값을 반환"이 아니라 "이 변수 참조를 반환"을 의미해야 합니다.이를 호출하는 코드에서 단순히 값을 복사하는 대신 해당 참조에 변수를 할당합니다.다음은 참조 매개변수와 참조 반환을 결합하는 어리석은 예입니다(두 개가 함께 갈 필요는 없으며 단지 예일 뿐입니다).
function &bar(&$some_param) { return $some_param; }
$a = 1;
$b =& bar($a);
// $b and $a now point at the same variable, not just the same value
// it was passed into and out of a function, and assigned to a new variable,
// but all those operations were by reference
많은 사람들이 참조로 변수를 전달하면 성능상의 이점을 얻을 수 있다고 잘못 믿고 있으며, 이것이 호출 시간 참조로 전달을 사용하는 유일한 이유인 경우가 많습니다.이는 실제로 일반적으로 잘못된 것입니다. PHP를 구동하는 Zend 엔진은 "쓰기 시 복사"라는 기술을 사용하여 동일한 값을 갖는 여러 변수를 동일한 메모리 조각을 가리키는 상태로 남겨두기 때문입니다. 참조.실제로 참조 할당은 일반적으로 패배하다 이 최적화는 엔진이 쓰기 시 복사 상태에 있는 변수를 추적하는 방식으로 인해 발생합니다.