Home > Article > Backend Development > What is a php "reference return"?
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.'<br />'; 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 '<hr />'; // 这样才是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!