2013-05-01 3 views
0

정보를 전달해야하는 기능이 있습니다. 정보는 객체 내에 포함됩니다. 그러므로 나는 그 객체를 함수 인자들 중 하나로 전달해야한다. 그러나 객체는 매우 큽니다. 전달할 때마다 사본을 만드는 데 소요되는 오버 헤드를 줄이고 싶습니다. 여기에 의 예입니다 내 함수를 호출 :참조 만 사용하고 PHP에서 객체 인수의 복사본을 만들지 마십시오

1 myFunction($myObject1); 

및 기능 : I보다 PHP에서 그것은 더이 이해

2 function myFunction($myObject2){ 
3 //do stuff 
4 } 

단지 통과에 의해 참조 대 통과에 의한 값 . 내가 틀렸다면 나를 바로 잡아라.하지만 나는 1 행에 객체에 대한 참조 만 있다고 믿지만, 2 행에는 객체가 복사된다. 이 사본을 피하기 위해 ($myObject2)(&$myObject2)으로 바꿨습니다. 나는 여전히 함수 정의 내의 객체를 $myObject2으로 참조하고 모든 것이 작동하는 것 같다. 저는 현재 참조만을 사용하고 있으므로 객체의 사본을 만들지 않는다고 생각합니다 (이것이 내 목표였습니다). 내 생각이 맞습니까? 이유가 아니라면?

답변

0

PHP5에서 "개체"는 값이 아닙니다. $myObject1, $myObject2 변수의 값은 객체 참조 (즉, 객체에 대한 포인터)입니다. 당신은 "객체 자체"를 얻을 수 없습니다. 객체는 이러한 포인터를 통해서만 조작 할 수 있습니다.

값에 의한 지정 및 전달은 값만 복사합니다. 객체는 값이 아니므로 할당, 전달 등을 통해 복제 할 수 없습니다. 객체를 복제하는 유일한 방법은 clone 연산자를 사용하는 것입니다.

변수에 &을 넣으면 &이없는 값 대신에 참조로 전달되거나 할당됩니다. 참조로 전달하면 전달 된 변수를 수정할 수 있습니다. 변수의 값은 객체가 될 수 없으므로 객체와 아무런 관련이 없습니다.

+0

그래서 나는 여전히 전체적으로 혼란 스럽지만, 이것이 의미하는 것 같습니다 : 1)'&'를 추가하면이 경우에는 전혀 없습니다. 2) 거대한 물건을 여러 번 앞뒤로 여러 번 통과 시키면 특별한 오버 헤드없이 매우 낮은 오버 헤드가 발생합니다. – VoltzRoad

+0

@VoltzRoad : 2는 정확합니다. 객체를 전달할 수 없기 때문에 객체에 대한 포인터 만 전달 (또는 할당 또는 처리)하기 때문입니다. 1은 사실이 아닙니다. '&'를 추가하면 참조로 전달됩니다. '&'가 없으면 값으로 전달됩니다. – newacct

관련 문제