문제

여기저기서 엇갈린 신호가 나오고 있어요.

변수를 참조로 전달하기 위해 앰퍼샌드를 사용합니까, 아니면 사용하지 않습니까?

다음 링크는 더 이상 사용되지 않으며 더 이상 필요하지 않음을 알려주는 것 같습니다.
http://gtk.php.net/manual/en/html/tutorials/tutorials.changes.references.html

그러나 이와 같은 스레드는 나를 궁금하게 만듭니다.
참조에 의한 호출 시간 전달이 더 이상 사용되지 않습니까?
PHP와 앰퍼샌드

제 질문을 예로 들어 보겠습니다.

PHP 5.5.5를 사용하여 함수를 만드는 경우:

function recurring_mailer_form($form, $form_state) 
{

}

다음과 동일합니까?

function recurring_mailer_form($form, &$form_state) 
{

}

?

도움이 되었습니까?

해결책

서로 다른 기사가 서로 다른 내용을 말하는 것처럼 보이는 이유는 서로 다른 종류의 참조별 전달에 대해 이야기하고 있기 때문입니다.

매개변수를 참조로 전달해야 하는지 결정하는 가장 중요한 것은 함수 서명 자체이며, 이에 대한 기본 사항은 PHP 4 이후로 변경되지 않았습니다.다음 예를 고려하십시오.

function foo( $by_value, &$by_reference ) { /* ... */ }

$a = 1; $b = 2;
foo( $a, $b );

여기서 외부변수는 $a 마치 다음과 같이 할당되는 것처럼 값으로 함수에 전달됩니다. $by_value = $a; - 변경 사항 $by_value 영향을 미칠 수 없다 $a.변수 $b 그러나 통과되고있다 참고로;양식의 할당과 마찬가지로 $by_reference =& $b; 이는 두 개의 이름으로 참조되는 하나의 변수가 있다는 것을 의미하며, 하나에 대한 할당은 둘 다에 대한 할당으로 작동합니다.

"일반" 값(문자열, 숫자 또는 배열)을 값으로 전달하면 해당 값이 새 변수에 복사됩니다. PHP 5부터:그러나 객체를 값으로 전달하면 약간 다른 일이 발생합니다. 복사된 "값"은 동일한 객체에 대한 포인터일 뿐입니다.이는 다음을 의미합니다. $a 객체였습니다. 호출할 수 있습니다. $by_value->some_property = 42; 그리고 $a->some_property 또한 그럴 것이다 42.그러나 새로운 값을 할당한 경우 $by_value, 여전히 영향을 미치지 않습니다 $a.

PHP 5.4까지, 있었다 추가의 참조 동작을 "강제"하기 위해 참조로 매개변수를 전달하는 방법 통화 시간에.이것은 당신이 쓸 수 있다는 것을 의미했습니다. foo(&$a, &$b); 변경 사항을 "캡처"합니다. $by_value 안에 foo() 기능.이에 의존하는 것은 일반적으로 나쁜 생각이므로 제거되었습니다.(PHP 6에서 제거될 예정이었기 때문에 5.4에 포함되었지만 해당 프로젝트는 5.3 및 5.4에 더 작은 변경 사항이 포함되어 무기한 보류되었습니다.)

마지막으로, 함수는 반품 참조에 의한 변수(예: 여기 매뉴얼에서 논의됨).실제로는 다음을 입력해야 하기 때문에 약간 까다롭습니다. & ~에 장소:함수 선언의 시작 부분에 다음과 같이 말합니다. return "이 값을 반환"이 아니라 "이 변수 참조를 반환"을 의미해야 합니다.이를 호출하는 코드에서 단순히 값을 복사하는 대신 해당 참조에 변수를 할당합니다.다음은 참조 매개변수와 참조 반환을 결합하는 어리석은 예입니다(두 개가 함께 갈 필요는 없으며 단지 예일 뿐입니다).

function &bar(&$some_param) { return $some_param; }
$a = 1;
$b =& bar($a);
// $b and $a now point at the same variable, not just the same value
// it was passed into and out of a function, and assigned to a new variable, 
// but all those operations were by reference

많은 사람들이 참조로 변수를 전달하면 성능상의 이점을 얻을 수 있다고 잘못 믿고 있으며, 이것이 호출 시간 참조로 전달을 사용하는 유일한 이유인 경우가 많습니다.이는 실제로 일반적으로 잘못된 것입니다. PHP를 구동하는 Zend 엔진은 "쓰기 시 복사"라는 기술을 사용하여 동일한 값을 갖는 여러 변수를 동일한 메모리 조각을 가리키는 상태로 남겨두기 때문입니다. 참조.실제로 참조 할당은 일반적으로 패배하다 이 최적화는 엔진이 쓰기 시 복사 상태에 있는 변수를 추적하는 방식으로 인해 발생합니다.

다른 팁

전혀 그렇지 않다.

  • 객체는 항상 자동으로 참조로 전달됩니다 (정보! 추가 중요한 정보는 아래를 참조하십시오!)

  • 참조로 매개 변수를 선언하는 기능 정의에서 발생해야합니다.

    function test(&$var) {}
    

    아니다 전화 할 때 :

    // wrong
    $var = '123';
    test(&$var);
    


평소와 같이 객체를 전달하면 객체의 상태 (속성)를 변경할 수 있습니다.
그것을 가정합니다 $obj 수업의 사례입니다 TestClass 호출 된 멤버 변수가 포함되어 있습니다 hello (ideone.com에서 전체 샘플을 보려면 여기를 클릭하십시오):

function modify($obj) { $obj->hello = 'world (modified)!'; }

$obj->hello = 'world';
modify($obj);
var_dump($obj->hello);  // outputs "world (modified!)"

이것은 자기 설명이어야합니다. 이제 동일한 코드를 사용하지만 다른 값을 $obj 대신 객체의 상태를 수정하면 수정이 없습니다 (→ ideone.com):

function modify($obj) { $obj = 42; }
// ...
var_dump($obj->hello);  // outputs "world"

참조로 매개 변수를 명시 적으로 수락하면 변수의 내용을 완전히 변경할 수 있습니다.→ ideone.com):

function modify(&$obj) { $obj = 42; }
// ...
var_dump($obj);         // outputs "42"

아니요, 그것들은 동일하지 않습니다. PHP 5.4+는 선언을 확인하여 함수를 호출 할 때 참조가 필요한지 여부를 호출하는 것을 감지합니다.

따라서 의도 된 사용법 인 경우 함수 선언에 참조 연산자가 필요하기 때문에 감가 상각되지 않아서.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top