有时我们宣布“&”超前于基于类的编码功能

时间:2011-12-29 05:57:53

标签: php copy-on-write reference

我正在遵循基于类的项目开发编码。我最近看到有时我们把“&”超出功能名称..

举个例子..

而不是定义

function test()

它被定义为

function &test()

“&”是否有任何特殊含义?

3 个答案:

答案 0 :(得分:4)

正如@philip所提到的那样,是return a reference

从以上链接:

  

注意:与参数传递不同,这里你必须使用&在这两个地方 - 表示你想要通过引用而不是副本返回,并指示应该为$ myValue完成引用绑定,而不是通常的赋值。


PHP将每个变量存储在ZVAL容器中。

从以上链接:

  

除了变量的类型和值之外,zval容器还包含两个额外的信息位。第一个称为“is_ref”,它是一个布尔值,表示变量是否是“引用集”的一部分。有了这个位,PHP的引擎知道如何区分正常变量和引用。由于PHP允许用户登陆,因为&运算符,zval容器还有一个内部引用计数机制来优化内存使用。这第二条附加信息称为“refcount”,它包含多少个变量名称(也称为符号)指向这个zval容器。


观察输出中变量的值:
在返回值的赋值时,请考虑以下内容而不&

$b=0;
function &func ($name) {
  global $b;
  $b = 10;
  return $b;
  }
$a = func("myname");// no & at assignment
++$a ;
echo '<br/>$a= '.$a.' $b= ' .$b."<br/>";
xdebug_debug_zval('a'); echo "<br/>";

上述代码的输出:

$a= 11 $b= 10
a: (refcount=1, is_ref=0)=11 

虽然函数通过引用返回,但引用是针对返回值的zval容器。现在,当我们尝试分配返回的值时(例如,在分配时没有&),只有“refcount”会增加。其中“is_ref”不会改变。当'存储返回值的变量'被尝试改变时,发生C.O.W (copy on write)并且创建新的zval容器,使得通过引用返回无用。因此,您还需要在返回值的赋值中添加&

在返回值赋值时考虑以下&

$b=0;
function &func ($name) {
  global $b;
  $b = 10;
  return $b;
  }
$a =& func("myname");// & at assignment
++$a ;
echo '<br/>$a= '.$a.' $b= ' .$b."<br/>";
xdebug_debug_zval('a'); echo "<br/>";

输出:

$a= 11 $b= 11
a: (refcount=2, is_ref=1)=11 

答案 1 :(得分:2)

答案 2 :(得分:1)

这意味着该函数返回对变量的引用。 您可以在此处详细了解:http://php.net/manual/en/language.references.php