명언이란 무엇인가
PHP에서 인용한다는 것은 동일한 변수 내용에 다른 이름으로 액세스하는 것을 의미합니다. 이는 C 포인터와는 다릅니다. 대신 참조는 기호 테이블 별칭입니다. PHP에서는 변수 이름과 변수 내용이 다르기 때문에 동일한 내용이라도 다른 이름을 가질 수 있습니다. 가장 가까운 비유는 Unix의 파일 이름과 파일 자체입니다. 변수 이름은 디렉토리 항목이고 변수 내용은 파일 자체입니다. 참조는 Unix 파일 시스템의 하드링크로 간주될 수 있습니다.
인용문의 역할
PHP의 참조에서는 두 변수가 동일한 내용을 가리킬 수 있도록 허용합니다. 이 작업을 수행할 때의 의미:
이는 $a와 $b가 동일한 변수를 가리킨다는 의미입니다.
참고:
여기서 $a와 $b는 정확히 동일합니다. $a가 $b를 가리키거나 그 반대가 아니라 $a와 $b가 같은 위치를 가리킵니다.
참고:
참조가 있는 배열을 복사하면 해당 값은 역참조되지 않습니다. 배열 값을 함수에 전달할 때도 마찬가지입니다.
참고:
정의되지 않은 변수가 참조로 할당되거나, 참조 매개변수로 전달되거나, 참조로 반환되면 해당 변수가 자동으로 생성됩니다.
예제 #1 정의되지 않은 변수에 대한 참조 사용
참조를 반환하는 함수와 new 연산자(PHP 4.0.4 이상)에서 동일한 구문을 사용할 수 있습니다.
PHP 5부터 new는 자동으로 참조를 반환하므로 여기서 =&를 사용하는 것은 더 이상 사용되지 않으며 E_STRICT 수준 메시지를 생성합니다.
참고:
& 연산자를 사용하지 않으면 개체 복사본이 생성됩니다. 클래스에서 $this를 사용하면 해당 클래스의 현재 인스턴스에 적용됩니다. &가 없는 할당은 인스턴스(예: 개체)를 복사하고 $this는 복사본에 적용되지만 항상 원하는 결과는 아닙니다. 성능 및 메모리 소비 문제로 인해 일반적으로 하나의 인스턴스에서만 작업하려고 합니다.
@new와 같은 @ 연산자를 사용하여 생성자에서 오류 메시지를 표시하지 않을 수 있지만 &new 문을 사용할 때는 아무런 효과가 없습니다. 이는 Zend 엔진의 제한 사항이며 구문 분석 오류가 발생합니다.
경고
함수 내에서 전역으로 선언된 변수에 참조가 할당되면 해당 참조는 함수 내에서만 표시됩니다. $GLOBALS 배열을 사용하면 이 문제를 피할 수 있습니다.
예제 #2 함수 내 전역 변수 참조
글로벌 $var;를 $var =& $GLOBALS['var'];의 약어로 생각하세요. 따라서 $var에 다른 참조를 할당하면 지역 변수에 대한 참조만 변경됩니다.
참고:
foreach 문에서 참조가 있는 변수에 값이 할당되면 참조된 개체도 변경됩니다.
예시 #3 인용 및 foreach 문
참조가 하는 두 번째 일은 참조로 변수를 전달하는 것입니다. 이는 함수 내에서 지역 변수를 생성하여 수행되며 해당 변수는 호출 범위에서 동일한 내용을 참조합니다. 예:
$a=5;
foo($a);
?>
$a를 6으로 변경합니다. 이는 foo 함수에서 $var 변수가 $a가 가리키는 것과 동일한 것을 가리키기 때문입니다. 자세한 설명은 참조로 전달을 참조하세요.
참조가 하는 세 번째 일은 참조 반환입니다.
인용이 아닌 것
앞서 언급했듯이 참조는 포인터가 아닙니다. 이는 다음 구조가 예상한 효과를 생성하지 않음을 의미합니다.
이렇게 하면 foo 함수의 $var 변수가 함수 호출 시 $bar에 바인딩되었다가 $GLOBALS["baz"]에 다시 바인딩됩니다. 참조 메커니즘을 통해 $bar를 함수 호출 범위 내의 다른 변수에 바인딩하는 것은 불가능합니다. 왜냐하면 foo 함수에는 $bar 변수가 없기 때문입니다($var로 표시되지만 $var에는 변수 내용만 있고 호출은 없습니다). 기호 테이블 이름-값 바인딩). 함수에 의해 선택된 참조 변수에 대한 참조 반환을 사용할 수 있습니다.
참조로 전달
함수가 인수 값을 수정할 수 있도록 변수를 참조로 함수에 전달할 수 있습니다. 구문은 다음과 같습니다.
함수 호출에는 참조 기호가 없으며 함수 정의에만 참조 기호가 있습니다. 매개변수를 참조로 올바르게 전달하려면 함수 정의만으로도 충분합니다. 최신 버전의 PHP에서는 foo(&$a);에서 &를 사용하면 "참조에 의한 호출 시간"이 더 이상 사용되지 않는다는 경고가 표시됩니다.
다음을 참조로 전달할 수 있습니다.
foo($a)와 같은 변수
foo(new foobar())
와 같은 새로운 문
함수에서 반환된 참조입니다. 예:
자세한 설명은 참조반환을 참조하세요.
다른 표현식은 참조로 전달할 수 없으며 결과는 정의되지 않습니다. 예를 들어, 참조로 전달하는 다음 예는 유효하지 않습니다.
이러한 조건은 PHP 4.0.4 이상 버전에서 사용할 수 있습니다.
참고로 반품
참조 반환은 참조가 바인딩되어야 하는 변수를 찾기 위해 함수를 사용하려는 경우에 사용됩니다. 성능을 높이기 위해 반환 참조를 사용하지 마십시오. 엔진은 자체적으로 최적화할 만큼 똑똑합니다. 유효한 기술적 이유가 있는 경우에만 참조를 반환하십시오! 참조를 반환하려면 다음 구문을 사용하세요.
이 예에서는 참조 구문을 사용하지 않은 것처럼 getValue 함수에 의해 반환된 개체의 속성에 복사되는 대신 값이 할당됩니다.
참고: 매개변수 전달과 달리 앰퍼샌드는 여기서 두 위치 모두에 사용되어야 합니다. 이는 일반 복사본이 아닌 참조가 반환됨을 나타내고 $myValue가 일반 할당이 아닌 참조로 바인딩됨을 나타냅니다.
참고: return ($this->value);와 같은 함수에서 참조를 반환하려고 하면 참조된 변수가 아닌 표현식의 결과를 반환하려고 하기 때문에 작동하지 않습니다. 함수에서는 참조 변수만 반환할 수 있으며 다른 방법은 없습니다. 코드에서 동적 표현식이나 new 연산자의 결과를 반환하려고 하면 PHP 4.4.0 및 PHP 5.1.0부터 E_NOTICE 오류가 발생합니다.
참조 설정을 해제하면 변수 이름과 변수 콘텐츠 간의 바인딩이 끊어집니다. 이는 변수 내용이 삭제된다는 의미는 아닙니다. 예:
이것을 Unix의 연결 해제 호출과 비유하면 이해하는 데 도움이 될 수 있습니다.
견적 포지셔닝
많은 PHP 구문 구조는 참조 메커니즘을 통해 구현되므로 위에서 참조 바인딩에 대해 언급한 모든 내용이 이러한 구조에도 적용됩니다. 참조에 의한 전달 및 반환과 같은 일부 구성은 이미 위에서 언급되었습니다. 참조를 사용하는 다른 구조는 다음과 같습니다.
global $var를 사용하여 변수를 선언하면 실제로 전역 변수에 대한 참조가 생성됩니다. 이렇게 하는 것도 마찬가지입니다.
예를 들어 unset $var는 전역 변수를 설정 해제하지 않는다는 의미입니다.
unset($a)와 $a=null을 사용한 결과는 다릅니다. 메모리 블록에 $a 매핑이 하나만 있으면 unset($a)는 $a=null과 동일합니다. 메모리 블록에 $a 매핑이 두 개 있으면 메모리 참조 횟수는 0이 되고 자동으로 재활용됩니다. a 및 $b 인 경우 unset($a)로 인해 $a=null이 발생하고 $b는 변경되지 않고 $a=null로 인해 $a=$b=null이 발생합니다.
원인: 변수에 null을 할당하면 해당 변수에 해당하는 메모리 블록의 참조 횟수가 직접 0으로 설정되고 자동으로 재활용됩니다.
$이것
객체 메서드에서 $this는 항상 이를 호출하는 객체에 대한 참조입니다.
인용의 역할
프로그램의 규모가 비교적 크고, 동일한 개체를 참조하는 변수가 많아 개체를 사용한 후 수동으로 지우고 싶다면 개인적으로 "&" 방식을 사용한 후 $var=null로 지우는 것을 추천합니다. 그 외의 경우에는 이를 사용하십시오. 또한 php5에서 큰 배열을 전송할 때는 "&" 방법을 사용하는 것이 좋습니다. 이는 결국 메모리 공간을 절약하기 때문입니다.
여기에 또 다른 작은 에피소드가 있습니다. PHP에서 주소의 포인팅(포인터와 유사) 기능은 사용자가 직접 구현하는 것이 아니라 Zend 코어에서 구현하는 것입니다. 즉, 쓰기 작업이 발생하면 동일한 주소를 가리키는 변수나 개체가 복사되지 않습니다.
일반인 용어로
1: 다음 코드가 있는 경우
사실 이때 $a와 $b가 서로 다른 메모리를 차지하는 것이 아니라 $a와 $b가 모두 동일한 메모리 주소를 가리키고 있습니다.
2: 위 코드에 다음 코드를 추가하면
$a와 $b가 가리키는 메모리의 데이터를 다시 작성해야 하므로 이때 Zend 코어는 $b에 대해 $a의 데이터 복사본을 자동으로 생성하고 조각을 다시 적용하도록 자동으로 결정합니다. 저장을 위한 메모리.
위 내용은 PHP 인용문에 관한 내용입니다. 모두 마음에 드셨으면 좋겠습니다.