2011-03-23 2 views

답변

3

다른 언어로 참조 (또는 포인터)를 호출하는 일반적인 이유는 공간을 절약하는 것입니다.하지만 PHP는 값에 의해 전달 된 것으로 선언 된 인수에 대해 copy-on-write를 구현할만큼 똑똑합니다. . PHP5에서는 항상 객체를 참조로 전달하는 연습을 도입했지만 배열 값은 항상 참조로 저장되며 call_user_func()은 항상 값으로 호출합니다. 참조로는 절대 호출하지 않습니다 (자체는 함수이므로 구조체가 아니기 때문에).).

그러나 이것은 원래 질문에 추가됩니다.

일반적으로 호출 된 기능이 반환 된 후에 명시 적으로 값을 다르게 지정하지 않는 한 항상 값 (복사)으로 전달하는 것으로 코드를 선언하는 것이 좋습니다. 그 이유는 호출 된 기능이 현재 작성중인 코드의 상태를 어떻게 변경 하는지를 알아야하기 때문입니다. 이러한 개념은 일반적으로 우려의 격리 및 분리라고합니다.

+1

+1을 알고 싶습니다. 이것은 데이터를 전달하고 메모리에서 어떤 일이 일어나는지에 대한 중요한 포인트입니다. – RobertPitt

2

PHP 5부터는 참조로 값을 전달할 실제 이유가 없습니다.

한 가지 예외는 적절한 위치로 배열을 수정하려는 경우입니다. 예를 들어 sort 기능을 예로 들어 보겠습니다. 배열이 참조로 전달된다는 것을 알 수 있습니다. 즉, 배열이 제 위치에서 정렬됩니다 (새로운 배열이 반환되지 않음).

또는 각 호출이 동일한 데이터 (종종 배열이기도 함)에 액세스해야하는 재귀 함수를 고려하십시오.

+0

-1 :이 답변에 강력히 동의하지 않습니다. – symcbean

+1

@symcbean : 이유를 설명하는 것이 중요합니까? –

+0

@symcbean - 'copy-on-write'행에 대해서 – Hacker

0

php4에서는 큰 변수에 사용되었습니다. 함수에 배열을 전달하면 배열은 함수에서 사용하기 위해 복사되고 많은 메모리와 CPU를 사용합니다. 그 해결책은 다음과 같습니다 :

function foo(&$arr) 
{ 
    echo $arr['value']; 
} 
$arr = new array(); 
foo($arr); 

이 방법은 참조, 배열 및 메모리와 cpu에 대한 링크 만 전달했습니다. php5 모든 객체와 배열 (int와 같은 스칼라가 확실하지 않음)은 내부적으로 참조로 전달되므로 직접 처리 할 필요가 없습니다.

0

함수는 항상 참조를 사용하는 것은 좋은 것입니다, 당신은 항상 전달 된 변수에 반환됩니다 같은 변수

 
$var = modify($var); 
function modify($var) 
{ 
return $var.'ret'; 
} 

에 전달 된 변수의 수정 된 버전을 반환 할 때이 최고입니다.

큰 변수와 특히 배열을 처리 할 때 가능한 경우 참조로 전달하는 것이 좋습니다. 이렇게하면 메모리를 절약 할 수 있습니다.

대개 배열을 처리 할 때 일반적으로 수정 된 배열을 원래 배열로 반환하므로 참조로 전달됩니다.

관련 문제