나는 php.net을 처음 사용하고 php.net에서 배웠다. 누구든지 요약에서 말할 수 있습니까? (http://php.net/manual/en/language.references.arent.php) 참조가없는 것 & 참조는 포인터가 아닙니다입니다.참조는 PHP에서 포인터가 아니므로?
초보자입니다. 누구든지 간단하고 쉬운 단어로 나를 설명해 주실 수 있습니까?
나는 php.net을 처음 사용하고 php.net에서 배웠다. 누구든지 요약에서 말할 수 있습니까? (http://php.net/manual/en/language.references.arent.php) 참조가없는 것 & 참조는 포인터가 아닙니다입니다.참조는 PHP에서 포인터가 아니므로?
초보자입니다. 누구든지 간단하고 쉬운 단어로 나를 설명해 주실 수 있습니까?
간단히 말하면 참조는 별칭입니다.
PHP의 변수는 이름과 값의 두 부분으로 저장됩니다. 이름이 값을 가리 킵니다. $x = 2;
가 실행되면, 이름 x
현재 범위 및 값 2
의 기호 테이블에 저장된다
$x = 2;
$y = $x;
$z = &$x;
는 저장하는 데이터 구조의 zval
(요청하지 않은, 그것의 내부 이름에 저장된 PHP의 가치). $y = $x;
가 실행되면, 이름 y
이 전류 범위의 심볼 테이블 $x
값 (2
)에 저장된다
는 새로운 zval
구조로 복사된다.
$z = &$x;
을 실행하면 z
이라는 이름이 현재 범위의 기호 테이블에 저장되지만 새 zval
은 만들어지지 않습니다. 대신 z
은 zval
을 x
으로 가리 키도록 설정됩니다.
$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 | --------------------+
| +---------+ |
+=================+
y
및 z
은 s입니다. x
이 아닌 다른 기호 테이블로 넘겨지며 f()
에 대한 호출이 반환 될 때 함께 제거됩니다 (포함 된 전체 기호 테이블과 함께).
y
이 제거되면 더 이상 가리 키지 않는 이름이 없기 때문에 값도 제거됩니다. 그러나 z
이 가리키는 값이 x
($z
은 별칭 임)으로 지정되기 때문에이 값은 z
과 함께 제거되지 않고 함수 호출에서도 유지됩니다. f()
은 $z
을 사용하여 값을 수정합니다. 이 변경 사항은 주 프로그램에서 변수 $x
을 통해 볼 수 있습니다.
함수는 함수가 참조를 반환 할 때 비슷한 방식으로 발생합니다. 이 함수는 복사되지 않은 값을 반환하지만이를 가리키는 새 이름이 호출 코드의 심볼 테이블에 만들어집니다.
언어 C 포인터가 무엇인지 의심 스러우면 연구하는 것이 좋습니다.
참조하지 메모리가 그 시점의 변수를 해결,하지만 그들은 함수에 매개 변수를 전달하고 기능을 변경하는 경우 해당 매개 변수가 수정 반환하는 유일한 방법입니다 :
어쨌든, 이것은 매우 단순화 된 설명입니다 .
그럼 ** 참조로 전달 **을 함수로 참조하는 이야기는 무엇입니까 ?? –
[zval]에 대한 자세한 정보 (http://www.phpinternalsbook.com/php7/internal_types/zvals.html) – hassan