2011-12-29 4 views

답변

4

을 @philip 언급, 그것은이 return a reference에 :

참고 : 매개 변수 전달과는 달리, 여기 당신이 가지고있는 위의 링크에서

두 위치 모두 &을 사용하십시오. 참조가 아닌 사본으로 리턴하려는 것을 나타내며, $ myValue에 대해 일] 지정 대신 참조 Y 인딩이 수행되어야 함을 나타내십시오.


PHP를 저장한다 ZVAL 용기 내의 모든 변수. 상기 링크에서


:

zval 컨테이너에 포함 된 변수의 종류와 값 이외는 information.The 추가 2 비트들은 제 "is_ref"라고하고 있는지의 여부를 나타내는 부울 값이다 변수는 "참조 집합"의 일부입니다. 이 비트로 PHP의 엔진은 일반적인 변수와 참조를 구별하는 방법을 알고 있습니다. PHP는 & 연산자로 생성 된 사용자 - 땅 참조를 허용하므로, zval 컨테이너는 메모리 사용을 최적화하기위한 내부 참조 계산 메커니즘을 가지고 있습니다. "refcount"라고하는이 두 번째 추가 정보에는이 하나의 zval 컨테이너를 가리키는 변수 이름 (기호라고도 함)이 포함됩니다.


은 출력 변수의 값을 관찰 :
는 반환 값의 할당에 &없이 다음을 고려

$b=0; 
function &func ($name) { 
    global $b; 
    $b = 10; 
    return $b; 
    } 
$a = func("myname");// no & at assignment 
++$a ; 
echo '<br/>$a= '.$a.' $b= ' .$b."<br/>"; 
xdebug_debug_zval('a'); echo "<br/>"; 

상기 코드에 대한 출력 :

$a= 11 $b= 10 
a: (refcount=1, is_ref=0)=11 

함수는 참조로 반환되지만 참조는 ret입니다. urned 값의 zval 컨테이너. 이제 반환 된 값을 할당하려고 할 때 (할당시 &없이) "refcount"만 증가합니다. 여기서 "is_ref"는 변경되지 않습니다.'반환 값이 저장된 변수'가 변경하려고하면 C.O.W (copy on write)이 발생하고 새로운 zval 컨테이너가 생성되어 참조가 쓸모 없게 렌더링됩니다. 따라서 반환 값의 할당에 &을 추가해야합니다.

는 반환 값의 할당에 &와 함께 다음과 같은 고려 :

$b=0; 
function &func ($name) { 
    global $b; 
    $b = 10; 
    return $b; 
    } 
$a =& func("myname");// & at assignment 
++$a ; 
echo '<br/>$a= '.$a.' $b= ' .$b."<br/>"; 
xdebug_debug_zval('a'); echo "<br/>"; 

출력 :

$a= 11 $b= 11 
a: (refcount=2, is_ref=1)=11 
2
+0

나는 당신의 연결을 확인했다 .. 그 기능의가 (이 함수 foo 같이 정의된다 & $ bar) {} 변수의 앞에없는 함수 앞에 "&"를 넣는 지 묻습니다. –

+0

두 링크가 모두 설명 할 수 있다고 생각합니다. 반환 참조는 설명입니다. y 우리의 쿼리 – Philip

+1

foo (& $ bar) {}에서 참조로 변수를 전달할 것이고 & foo ($ bar)에서 참조로 어떤 것을 반환 할 것이기 때문입니다. –