수색…


통사론

  • $foo = 1; $bar = &$foo; // both $foo and $bar point to the same value: 1
  • $var = 1; function calc(&$var) { $var *= 15; } calc($var); echo $var;

비고

두 변수를 참조로 지정하는 동안 두 변수는 모두 같은 값을 가리 킵니다. 다음 예제를 참조하십시오.

$foo = 1;
$bar = &$foo;

$foo $bar 가리 키지 않습니다 . $foo 그리고 $bar 의 같은 값으로 두 지점 $foo 이고, 1 . 설명하기 :

$baz = &$bar;
unset($bar);
$baz++;

우리가 관계에 대한 points to 가지고 있다면 unset() 후에 이것이 깨질 것입니다. 대신 $foo$baz 여전히 같은 값인 2 가리킨다.

참조로 지정

이것은 참조의 첫 번째 단계입니다. 본질적 으로 참조로 지정 하면 두 변수가 같은 값을 공유하도록 허용합니다.

$foo = &$bar;

$foo$bar 는 동일합니다. 그들은 서로를 가리 키지 않습니다 . 그들은 같은 장소 ( "가치" )를 가리 킵니다.


array() 언어 구문 내에서 참조로 지정할 수도 있습니다. 엄밀히 말하면 참조에 의한 지정이 아닙니다.

$foo = 'hi';
$bar = array(1, 2);
$array = array(&$foo, &$bar[0]);

배열 내부 참조가 잠재적으로 위험한 것을 유의하십시오. 오른쪽에 참조가있는 정상적인 (참조가 아닌) 할당을 수행하면 왼쪽을 참조로 전환하지 않지만 배열 내부의 참조는 이러한 일반 할당에서 보존됩니다. 이것은 배열이 값에 의해 전달되는 함수 호출에도 적용됩니다.

참조에 의한 할당은 변수와 배열에만 국한되지 않고 함수와 모든 "참조에 의한 전달"연관에 대해서도 제시됩니다.

function incrementArray(&$arr) {
    foreach ($arr as &$val) {
        $val++;
    }
}

function &getArray() {
    static $arr = [1, 2, 3];
    return $arr;
}

incrementArray(getArray());
var_dump(getArray()); // prints an array [2, 3, 4]

할당은 위와 같이 함수 정의 내에서 핵심입니다. 값 / 변수 만 참조로 표현식을 전달할 수 없습니다 . 그러므로 bar() 에서 $a 의 인스턴스화.

참조로 돌아 가기

때로는 암묵적으로 참조로 반환 할 시간이 있습니다.

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

참조로 돌아 가기위한 PHP 문서 에서 가져온 것.

다음 예제를 포함하여 참조로 가져올 수있는 여러 가지 양식이 있습니다.

function parent(&$var) {
    echo $var;
    $var = "updated";
}

function &child() {
    static $a = "test";
    return $a;
}

parent(child()); // returns "test"
parent(child()); // returns "updated"

참조로 돌아 오는 것은 함수 참조에만 국한되지 않습니다. 또한 암시 적으로 함수를 호출 할 수 있습니다.

function &myFunction() {
    static $a = 'foo';
    return $a;
}

$bar = &myFunction();
$bar = "updated"
echo myFunction();

함수 호출을 직접 참조 할 수는 없지만 변수를 사용하기 전에 변수에 할당해야합니다. 어떻게 작동하는지 보려면 echo &myFunction(); .


노트

  • 사용하려는 두 곳에서 참조 ( & )를 지정해야합니다. 즉, 함수 정의 ( function &myFunction() {... ) 및 호출 참조 ( function callFunction(&$variable) {... 또는 &myFunction(); )를 의미합니다.
  • 변수는 참조로만 리턴 할 수 있습니다. 그러므로 위의 예제에서 $a 의 인스턴스화. 이것은 표현식을 반환 할 수 없다는 것을 의미합니다. 그렇지 않으면 E_NOTICE PHP 오류가 생성됩니다 (주의 Notice: Only variable references should be returned by reference in ...... ).
  • 참조로 돌아 오는 경우에는 합법적 인 사용 사례가 있지만 동일한 목표를 달성 할 수있는 다른 모든 옵션을 검토 한 후에 만 ​​사용하도록주의해야합니다.

참조로 전달

이렇게하면 원래 변수를 수정할 수있는 함수 또는 요소에 대한 참조로 변수를 전달할 수 있습니다.

참조를 통한 전달은 변수에만 국한되지 않고 다음을 참조로 전달할 수도 있습니다.

  • 새로운 문장, 예를 들어 foo(new SomeClass)
  • 함수에서 반환 된 참조

배열

"참조에 의한 전달" 의 일반적인 사용은 새 배열을 만들거나 네임 스페이스를 낭비하지 않고 배열 내의 초기 값을 수정하는 것입니다. 참조 전달은 변수 앞에 & => &$myElement 붙이는 것과 같이 간단합니다.

다음은 배열에서 요소를 사용하고 단순히 초기 값에 1을 더하는 예제입니다.

$arr = array(1, 2, 3, 4, 5);

foreach($arr as &$num) {
    $num++;
}

이제 $arr 내의 모든 요소를 ​​사용하면 참조가 증가함에 따라 원본 요소가 업데이트됩니다. 다음 방법으로 확인할 수 있습니다.

print_r($arr);

노트

루프 내에서 참조로 전달할 때주의해야합니다. 위의 루프가 끝나면 $num 여전히 배열의 마지막 요소에 대한 참조가 저장됩니다. 그것을 포스트 루프로 지정하면 마지막 배열 요소를 조작하게됩니다! 이것은 post-loop를 unset() 할 때 발생하지 않도록 보장 할 수 있습니다 :

$myArray = array(1, 2, 3, 4, 5);

foreach($myArray as &$num) {
   $num++;
}
unset($num);

위의 내용은 문제가 발생하지 않도록합니다. 이것과 관련된 문제의 예가이 질문에 StackOverflow에 있습니다.


기능들

참조로 전달하는 또 다른 일반적인 사용법은 함수 내에 있습니다. 원래 변수를 수정하는 것은 다음과 같이 간단합니다.

$var = 5;
// define
function add(&$var) {
    $var++;
}
// call
add($var);

원래 변수를 echo 하여 검증 할 수 있습니다.

echo $var;

아래에는 PHP 문서에서 언급 한 것처럼 함수에 대한 다양한 제한이 있습니다.

참고 : 함수 호출에는 참조 기호가 없습니다 (함수 정의에만 해당). 함수 정의만으로도 인수를 참조로 올바르게 전달할 수 있습니다. PHP 5.3.0부터 foo (& $ a);를 &를 사용하면 "call-time-by-reference"가 사용되지 않을 것이라는 경고 메시지가 나타납니다. 그리고 PHP 5.4.0에서, 참조에 의한 호출 - 시간 참조가 제거되었으므로 치명적인 오류가 발생합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow