Home  >  Article  >  Backend Development  >  What is a php "reference return"?

What is a php "reference return"?

伊谢尔伦
伊谢尔伦Original
2017-06-27 13:52:051064browse

Many times we will see code like this (from the CI framework source code):

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

We all know that the '&' in it refers to a reference, but what is its role? What kind of problems can it solve? With these questions, we begin to understand "reference return".

Reference return

The manual says this: Reference return is used when you want to use a function to find which variable the reference should be bound to. Don't use return references to increase performance, the engine is smart enough to optimize it itself. Only return references if there is a valid technical reason! To return a reference, use this syntax:

<?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
?>

In this example the properties of the object returned by the getValue() function will be assigned a value, not copied, just as if the reference syntax was not used.

Different from parameter passing, the & symbol must be used in both places here - indicating that a reference is returned, not a usual copy, and also indicating that $myValue is bound as a reference, and Not an ordinary assignment.

If you try to return a reference from a function like this: return ($this->value);, this will not work because you are trying to return the result of an expression instead of one referenced variable. You can only return reference variables from functions - there is no other way. If code attempts to return the result of a dynamic expression or new operator, an E_NOTICE error will be issued starting with PHP 4.4.0 and PHP 5.1.0.

Although you don’t understand? So let’s rewrite the program and make it a regular function:

<?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
?>

Now we can understand that "reference return is used when you want to use a function to find which variable the reference should be bound to." In a word, the function &getValue() binds the reference to the member variable $value. Normally, the $obj generated by $obj = new foo; is a copy, and its member variable $value does not have an "alias" (reference) relationship with the function getValue().

Look at the simple example below and try to understand reference return.

<?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
?>

Program running result: 1236

Using the above example to explain, $a = test() calls a function in this way, just assigning the value of the function to $a, and Any changes to $a will not affect $b in the function.

When calling a function through $a = &test(), its function is to point the memory address of the $b variable in return $b to the same place as the memory address of the $a variable. That is to say, the effect is equivalent to ($a=&$b), so changing the value of $a also changes the value of $b. So after executing

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

, the value of $b becomes 5.

Let’s take another program example to deepen our understanding:

<?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);
?>

The above is the detailed content of What is a php "reference return"?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn