앰퍼샌드로 PHP 기능을 시작한다는 것은 무엇을 의미합니까?


129

이 코드와 함께 Facebook 라이브러리를 사용하고 있습니다.

class FacebookRestClient {
...
    public function &users_hasAppPermission($ext_perm, $uid=null) {
        return $this->call_method('facebook.users.hasAppPermission', 
        array('ext_perm' => $ext_perm, 'uid' => $uid));
    }
...
}

함수 정의의 시작 부분에서 &는 무엇을 의미하며 이와 같은 라이브러리를 사용하는 방법은 무엇입니까?

답변:


157

함수 이름 앞의 앰퍼샌드는 함수가 값 대신 변수에 대한 참조를 반환 함을 의미합니다.

참조로 반환은 함수를 사용하여 참조를 바인딩 할 변수를 찾으려고 할 때 유용합니다. 성능을 향상시키기 위해 참조 별 반환을 사용하지 마십시오. 엔진은이를 자동으로 최적화합니다. 유효한 기술적 이유가있는 경우에만 참조를 반환하십시오.

참조 반환을 참조 하십시오 .


1
따라서 너무 자세하게 설명하지 않으면 클래스를 인스턴스화하여 $ results = $ facebook-> users_hasAppPermission ($ param1, $ param2); ? 나는 뉘앙스에 대해 확신하지 못하지만 도움을 주셔서 감사합니다.
Alex Mcp 2009

2
네-그냥 그렇게 부르겠습니다.
Dominic Rodger

16

이미 언급했듯이 참조를 반환합니다. PHP 4에서 객체는 다른 값과 마찬가지로 값으로 할당되었습니다. 이것은 직관적이지 않으며 대부분의 다른 언어가 작동하는 방식과 상반됩니다.

이 문제를 해결하기 위해 객체를 가리키는 변수에 참조가 사용되었습니다. PHP 5에서는 참조가 거의 사용되지 않습니다. 나는 이것이 PHP 4와의 호환성을 유지하려고 노력하는 레거시 코드 또는 코드라고 생각합니다.


공식 Facebook PHP 라이브러리 인 FWIW입니다.
Alex Mcp 2009

4
@Alex :이 경우, 아마도 PHP4를 사용하는 캐주얼 해커를 스스로 보호 할 수 있습니다. 당신은 자신의 코드에서 이것을해서는 안됩니다-더 이상 사용되지 않습니다.
troelskn

3
"이것은 매우 직관적이지 않으며 대부분의 다른 언어가 작동하는 방식과 상반됩니다"라고 더 동의 할 수 없었습니다.
궤도에서 가벼움 경주

5
@WildlyInaccurate : .NET과 Java에서 발생하는 기본적으로 참조로 객체를 할당하는 것은 매우 직관적이지 않습니다. 대부분의 다른 언어들에서, 당신은 "객체"또는 원시적 또는 다른 것을 가지고 있든, 복사에 의해 할당이 이루어지며, 이것이 새벽 이래 이래로 발생했기 때문에, 이것은 세상이 고집해야 할 것입니다.
궤도에서 가벼움 경주

4
직관적인지 여부는 다소 주관적 일 수 있습니다. 그러나 PHP와 유사한 언어의 경우 표준은 객체를 참조로 전달하는 것입니다. OOP와 관련하여 OOP가 상태 캡슐화에 관한 것이기 때문에 이것이 가장 직관적 인 방법이라고 말할 것이므로 프로그램은 일반적으로 상태를 복제하는 대신 해당 상태를 참조합니다.
troelskn

4

이것은 종종 PHP에서 Returning reference 또는 Returning by reference 알려져 있습니다.

참조로 반환은 함수를 사용하여 참조를 바인딩 할 변수를 찾으려고 할 때 유용합니다. 성능을 향상시키기 위해 참조 별 반환을 사용하지 마십시오. 엔진은이를 자동으로 최적화합니다. 유효한 기술적 이유가있는 경우에만 참조를 반환하십시오.

반환 참조에 대한 PHP 설명서

참조 PHP에서 단순히 변수의 콘텐츠에 할당 된 다른 이름이다. PHP 참조는 C 프로그래밍의 포인터와 다릅니다 않으며 실제 메모리 주소가 아니므로 포인터 산술에 사용할 수 없습니다.

참조를 반환하는 개념은 특히 초보자에게 매우 혼란 스러울 수 있으므로 예제가 도움이 될 것입니다.

$populationCount = 120;

function &getPopulationCount() {
  global $populationCount;
  return $populationCount;
}

$countryPopulation =& getPopulationCount();
$countryPopulation++;
echo "\$populationCount = $populationCount\n"; // Output: $populationCount = 121 
echo "\$countryPopulation = $countryPopulation\n"; //Output: $countryPopulation = 121 

getPopulationCount()앞에 정의 된 함수 &는의 내용 또는 값에 대한 참조를 반환합니다 $populationCount. 따라서 증가 $countryPopulation는 또한 증가 $populationCount합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.