我正在关注基于类的项目开发编码。我最近看到有时我们将“&”放在函数名称之前。
举个例子。。
而不是定义
function test()
它被定义为
function &test()
“&”有什么特殊含义吗?
我正在关注基于类的项目开发编码。我最近看到有时我们将“&”放在函数名称之前。
举个例子。。
而不是定义
function test()
它被定义为
function &test()
“&”有什么特殊含义吗?
正如@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
这意味着该函数返回对变量的引用。您可以在此处阅读更多信息:http: //php.net/manual/en/language.references.php