我正在遵循基于类的项目开发编码。我最近看到有时我们把“&”超出功能名称..
举个例子..
而不是定义
function test()
它被定义为
function &test()
“&”是否有任何特殊含义?
答案 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