>  기사  >  백엔드 개발  >  PHP "참조 반환"이란 무엇입니까?

PHP "참조 반환"이란 무엇입니까?

伊谢尔伦
伊谢尔伦원래의
2017-06-27 13:52:051085검색

다음과 같은 코드를 여러 번 볼 수 있습니다(CI 프레임워크 소스 코드에서):

$class =& load_class('a','b');

여기에 있는 '&'가 참조를 참조한다는 것은 모두 알고 있지만 그 역할은 무엇인가요? 어떤 종류의 문제를 해결할 수 있나요? 이러한 질문을 통해 우리는 "참조 반환"을 이해하기 시작합니다.

참조 반환

설명서에는 다음과 같이 나와 있습니다. 참조 반환은 참조가 바인딩되어야 하는 변수를 찾기 위해 함수를 사용하려고 할 때 사용됩니다. 성능을 높이기 위해 반환 참조를 사용하지 마십시오. 엔진은 자체적으로 최적화할 만큼 똑똑합니다. 유효한 기술적 이유가 있는 경우에만 참조를 반환하십시오! 참조를 반환하려면 다음 구문을 사용하세요.

<?php
class foo {
    public $value = 42;
    public function &getValue() {
        return $this->value;
    }
}
$obj = new foo;
// $myValue is a reference to $obj->value, which is 42.
// $myValue 是 $obj->value 的引用,它们的值都是 42
$myValue = &$obj->getValue(); 
// 对 $obj->value 重新复制,会影响到 $myValue 的值
$obj->value = 2;
// prints the new value of $obj->value, i.e. 2.
echo $myValue; // 程序输出 2
?>

이 예에서 getValue() 함수에 의해 반환된 개체의 property에는 참조 구문을 사용하지 않은 것처럼 복사되지 않고 값이 할당됩니다.

매개변수 전달과 달리 앰퍼샌드는 여기서 두 위치 모두에 사용되어야 합니다. 즉, 일반적인 복사본이 아닌 참조가 반환되었음을 나타내고 $myValue가 일반적인 할당이 아닌 참조로 바인딩되었음을 나타냅니다.

return ($this->value);와 같은 함수에서 참조를 반환하려고 하면 참조된 변수가 아닌 표현식의 결과를 반환하려고 하기 때문에 작동하지 않습니다. 함수에서는 참조 변수만 반환할 수 있으며 다른 방법은 없습니다. 코드가 동적 표현식이나 새 연산자의 결과를 반환하려고 하면 PHP 4.4.0 및 PHP 5.1.0부터 E_NOTICE 오류가 발생합니다.

이해하는 것 같으면서도 이해가 안 되시나요? 이제 프로그램을 다시 작성하여 일반 함수로 바꿔보겠습니다.

<?php
class foo {
    public $value = 42;
    public function getValue() {
        return $this->value;
    }
}
$obj = new foo;
$myValue = $obj->getValue(); 
$obj->value = 2;
echo $obj->value;  // 程序输出 2
echo $myValue; // 程序输出 42
?>

이제 "참조 반환은 참조가 바인딩되어야 하는 변수를 찾기 위해 함수를 사용하려는 경우 &getValue 함수에 사용됩니다."라는 문장을 이해할 수 있습니다. ()는 참조를 멤버 변수 $value에 바인딩합니다. 일반적으로 $obj = new foo;에 의해 생성된 $obj는 복사본이며 해당 멤버 변수 $value에는 getValue() 함수와 "별칭"(참조) 관계가 없습니다.

아래의 간단한 예를 보고 참조 반환을 이해해 보세요.

<?php
function &test()
{
// 声明一个静态变量
    static $b = 0;
    $b = $b+1;
    echo $b;
    return $b;
}
$a = test();//这条语句会输出 $b 的值为 1
$a = 5;
$a = test();//这条语句会输出 $b 的值为2
$a = &test();//这条语句会输出 $b 的值为3
$a = 5;
$a = test();//这条语句会输出 $b的值 为6
?>

프로그램 실행 결과: 1236

위의 예를 들어 설명하자면, 이런 식으로 함수를 호출하면 $a = test()는 함수의 값을 $a에 할당만 하고 $a에 대한 변경 사항은 발생하지 않습니다. $b 함수에 있습니다.

그리고 $a = &test()를 통해 함수를 호출할 때 해당 함수는 $b 변수의 메모리 주소를 $a 변수의 메모리 주소와 동일한 위치로 반환하는 $b 변수의 메모리 주소를 가리키는 것입니다. 즉, 그 효과는 ($a=&$b)와 동일하므로 $a 값을 변경하면 $b 값도 변경됩니다. 따라서

$a = &test();    
$a = 5;

를 실행한 후 $b의 값은 5가 됩니다.

이해를 심화시키는 또 다른 프로그램 예:

<?php
/*
** 值传递和引用传递,值传递传递的是值的一个复本,引用传递传递的是值指向的内存地址
*/
// 函数的引用,定义时也要加上 &
function &func($a,$b){ 
// 这里为了更直观看到效果,定义一个静态变量
static $result = 0;  
$result+=$a+$b;
echo $result.&#39;<br />&#39;;
return $result;
}
 
$a = $b = 10;
// PHP里这样写函数的引用调用,和调用普通函数没有区别(只是将函数的返回值复制给$c这个变量,$c做任何改变不会影响上面函数中的$result)
// 要记住:PHP里的函数引用定义及调用都要在函数名前加上 &
$c = func($a,$b); 
// 第一次执行func(),其静态变量$result的值变为 20(10+10)
// 改变$c的值,不会对下面一行语句产生影响
$c = 666;  
// 第二次执行func(),其静态变量$result的值变为 40(20+10+10)
$c = func($a,$b);
echo &#39;<hr />&#39;;
// 这样才是PHP中引用函数的调用方式
$d = &func($a,$b);  
// 第三次执行func(),其静态变量$result的值变为 40(40+10+10)
$d = 888;
// 第四次执行func(),其静态变量$result的值变为 908(888+10+10)
$d = func($a,$b);
?>

위 내용은 PHP "참조 반환"이란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.