2017-09-28 1 views

답변

3

간단히 말하면 참조는 별칭입니다.

PHP의 변수는 이름과 값의 두 부분으로 저장됩니다. 이름이 값을 가리 킵니다. $x = 2;가 실행되면, 이름 x 현재 범위 및 값 2의 기호 테이블에 저장된다

$x = 2; 
$y = $x; 
$z = &$x; 

는 저장하는 데이터 구조의 zval (요청하지 않은, 그것의 내부 이름에 저장된 PHP의 가치). $y = $x;가 실행되면, 이름 y이 전류 범위의 심볼 테이블 $x 값 (2)에 저장된다

는 새로운 zval 구조로 복사된다.

$z = &$x;을 실행하면 z이라는 이름이 현재 범위의 기호 테이블에 저장되지만 새 zval은 만들어지지 않습니다. 대신 zzvalx으로 가리 키도록 설정됩니다.

변수에 의해 사용되는 메모리가 $x, $y$z은 다음과 같습니다

:

값이 함수에 참조로 전달이나 기능이 같은 일이 일어날 참조, 이름 만 반환
+---------+    +---------+ 
| x | -------------> | 2 | 
+---------+    +---------+ 
           ^
+---------+      |  +---------+ 
| y | -------------------------> | 2 | 
+---------+      |  +---------+ 
           | 
+---------+      | 
| z | --------------------+ 
+---------+ 

서로 다른 기호 표에 저장됩니다 (위의 설명에서 "current scope"을 말하십시오).

function f(& $z) { 
    $y = $z; 
    $z = $z + 2; 
} 
$x = 2; 
f($x); 

메모리는 다음과 같습니다 $x = 2; 후 :

하자 '는이 코드 표시 기능 f()의 실행 중에

+---------+    +---------+ 
| x | -------------> | 2 | 
+---------+    +---------+ 

을, 메모리는 다음과 같습니다

+===== global ====+ 
| +---------+ |   +---------+ 
| | x | -------------> | 4 | 
| +---------+ |   +---------+ 
+=================+    ^
            | 
+====== f() ======+     | 
| +---------+ |     |  +---------+ 
| | y | -------------------------> | 2 | 
| +---------+ |     |  +---------+ 
|     |     | 
| +---------+ |     | 
| | z | --------------------+ 
| +---------+ | 
+=================+ 

yz은 s입니다. x이 아닌 다른 기호 테이블로 넘겨지며 f()에 대한 호출이 반환 될 때 함께 제거됩니다 (포함 된 전체 기호 테이블과 함께).

y이 제거되면 더 이상 가리 키지 않는 이름이 없기 때문에 값도 제거됩니다. 그러나 z이 가리키는 값이 x ($z은 별칭 임)으로 지정되기 때문에이 값은 z과 함께 제거되지 않고 함수 호출에서도 유지됩니다. f()$z을 사용하여 값을 수정합니다. 이 변경 사항은 주 프로그램에서 변수 $x을 통해 볼 수 있습니다.

함수는 함수가 참조를 반환 할 때 비슷한 방식으로 발생합니다. 이 함수는 복사되지 않은 값을 반환하지만이를 가리키는 새 이름이 호출 코드의 심볼 테이블에 만들어집니다.

+0

그럼 ** 참조로 전달 **을 함수로 참조하는 이야기는 무엇입니까 ?? –

+0

[zval]에 대한 자세한 정보 (http://www.phpinternalsbook.com/php7/internal_types/zvals.html) – hassan

0

언어 C 포인터가 무엇인지 의심 스러우면 연구하는 것이 좋습니다.

참조하지 메모리가 그 시점의 변수를 해결,하지만 그들은 함수에 매개 변수를 전달하고 기능을 변경하는 경우 해당 매개 변수가 수정 반환하는 유일한 방법입니다 :

어쨌든, 이것은 매우 단순화 된 설명입니다 .