2

我正在关注基于类的项目开发编码。我最近看到有时我们将“&”放在函数名称之前。

举个例子。。

而不是定义

function test()

它被定义为

function &test()

“&”有什么特殊含义吗?

4

3 回答 3

4

正如@philip 提到的,它是返回一个参考

从上面的链接:

注意:与参数传递不同,这里你必须在两个地方都使用 & - 表示你想通过引用而不是副本返回,并表示应该为 $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 容器。现在,当我们尝试分配返回值时(比如&在分配时没有 a)只有“refcount”会增加。其中“is_ref”不会被更改。当尝试更改“存储返回值的变量”时,会发生COW(写入时复制)并创建一个新的 zval 容器,从而使通过引用返回的返回无用。因此,您还需要&在分配返回值时添加 at 。

&在分配返回值时考虑以下内容:

$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 
于 2011-12-29T07:16:45.047 回答
2

按引用传递返回引用

于 2011-12-29T06:01:02.493 回答
1

这意味着该函数返回对变量的引用。您可以在此处阅读更多信息:http: //php.net/manual/en/language.references.php

于 2011-12-29T06:01:52.077 回答