참조란 무엇인가요?
PHP에서 인용이란 동일한 변수 내용에 다른 이름으로 액세스하는 것을 의미합니다. 이는 C 포인터와는 다릅니다. 대신 참조는 기호 테이블 별칭입니다. PHP에서는 변수 이름과 변수 내용이 다르기 때문에 동일한 내용이라도 다른 이름을 가질 수 있습니다. 가장 가까운 비유는 Unix의 파일 이름과 파일 자체입니다. 변수 이름은 디렉토리 항목이고 변수 내용은 파일 자체입니다. 참조는 Unix 파일 시스템의 하드링크로 간주될 수 있습니다.
참조의 역할
PHP의 참조를 사용하면 두 변수가 동일한 내용을 가리킬 수 있습니다. 의미:
<?php $a =& $b; ?>
$a와 $b가 동일한 변수를 가리킨다는 의미입니다.
참고:
여기서 $a와 $b는 완전히 동일합니다. $a가 $b를 가리키거나 그 반대도 아니지만 $a와 $b가 같은 위치를 가리킵니다. .
참고:
참조가 있는 배열을 복사해도 해당 값은 역참조되지 않습니다. 배열 값을 함수에 전달할 때도 마찬가지입니다.
참고:
정의되지 않은 변수가 참조로 할당되거나 참조 매개변수로 전달되거나 참조로 반환되면 변수가 자동으로 생성됩니다.
예제 #1 정의되지 않은 변수에 대한 참조 사용
<?php function foo(&$var) { } foo($a); // $a is "created" and assigned to null $b = array(); foo($b['b']); var_dump(array_key_exists('b', $b)); // bool(true) $c = new StdClass; foo($c->d); var_dump(property_exists($c, 'd')); // bool(true) ?>
참조를 반환하는 함수와 new 연산자(PHP 4.0.4 이상 버전)에서 동일한 구문을 사용할 수 있습니다. :
<?php $bar =& new fooclass(); $foo =& find_var($bar); ?>
PHP 5부터 new는 자동으로 참조를 반환하므로 여기서 =&를 사용하는 것은 더 이상 사용되지 않으며 E_STRICT 수준 메시지를 생성합니다.
참고:
& 연산자를 사용하지 않으면 객체의 복사본이 생성됩니다. 클래스에서 $this를 사용하면 클래스의 현재 인스턴스에 적용됩니다. &가 없는 할당은 인스턴스(예: 개체)를 복사하고 $this는 복사본에 적용되지만 항상 원하는 결과는 아닙니다. 성능 및 메모리 소비 문제로 인해 일반적으로 하나의 인스턴스에서만 작업하려고 합니다.
@new와 같은 @ 연산자를 사용하여 생성자에서 오류 메시지를 표시하지 않을 수 있지만 &new 문을 사용할 때는 아무런 효과가 없습니다. 이는 Zend 엔진의 제한 사항이며 구문 분석 오류가 발생합니다.
경고 함수 내에서 전역으로 선언된 변수에 참조가 할당되면 해당 참조는 함수 내에서만 표시됩니다. $GLOBALS 배열을 사용하면 이 문제를 피할 수 있습니다.
예제 #2 함수 내에서 전역 변수 참조
<?php $var1 = "Example variable"; $var2 = ""; function global_references($use_globals) { global $var1, $var2; if (!$use_globals) { $var2 =& $var1; // visible only inside the function } else { $GLOBALS["var2"] =& $var1; // visible also in global context } } global_references(false); echo "var2 is set to '$var2'\n"; // var2 is set to '' global_references(true); echo "var2 is set to '$var2'\n"; // var2 is set to 'Example variable' ?>
전역 $var;을 $var =& $GLOBALS['var'];의 약어로 취급합니다. 따라서 $var에 다른 참조를 할당하면 지역 변수의 참조만 변경됩니다.
참고:
foreach 문에서 참조가 있는 변수에 값을 할당하면 참조된 개체도 변경됩니다.
예제 #3 foreach 문을 사용한 참조
<?php $ref = 0; $row =& $ref; foreach (array(1, 2, 3) as $row) { // do something } echo $ref; // 3 - last element of the iterated array ?>
참조가 수행하는 두 번째 작업은 참조로 변수를 전달하는 것입니다. 이는 함수 내에서 지역 변수를 생성하여 수행되며 해당 변수는 호출 범위에서 동일한 내용을 참조합니다. 예를 들어
<?php function foo(&$var) { $var++; } $a=5; foo($a); ?>
은 $a를 6으로 변경합니다. 이는 foo 함수의 $var 변수가 $a가 가리키는 내용과 동일한 내용을 가리키기 때문입니다.
참조가 하는 세 번째 일은 참조 반환입니다.
참조가 아닌 것
앞서 언급했듯이 참조는 포인터가 아닙니다. 이는 다음 구조가 예상한 효과를 갖지 않음을 의미합니다.
<?php function foo(&$var) { $var =& $GLOBALS["baz"]; } foo($bar); ?>
이렇게 하면 foo 함수의 $var 변수가 함수 호출 시 $bar에 바인딩되었다가 다시 바인딩됩니다. $GLOBALS["baz"] 위에 설정하세요. 함수 foo에는 $bar 변수가 없기 때문에 참조 메커니즘을 통해 $bar를 함수 호출 범위의 다른 변수에 바인딩할 수 없습니다($var로 표시되지만 $var에는 변수 내용만 있고 호출은 없습니다). 기호 테이블 이름-값 바인딩). 함수에 의해 선택된 참조 변수에 대한 참조 반환을 사용할 수 있습니다.