Php 为什么代码以WRT引用返回的方式运行?
这是我的设置:Php 为什么代码以WRT引用返回的方式运行?,php,copy-on-write,reference,Php,Copy On Write,Reference,这是我的设置: 显示\u启动\u错误=打开 显示错误=打开 错误报告=E|u ALL | E|u STRICT $b; function func ($name) { global $b; $b = 10; return $b; } $a =& func("myname"); ++$a ; echo '<br/>$a= '.$a.' $b= ' .$b."<br/>"; xdebug_debug_zval('a'); echo "<br/&g
显示\u启动\u错误=打开
显示错误=打开
错误报告=E|u ALL | E|u STRICT
$b;
function func ($name) {
global $b;
$b = 10;
return $b;
}
$a =& func("myname");
++$a ;
echo '<br/>$a= '.$a.' $b= ' .$b."<br/>";
xdebug_debug_zval('a'); echo "<br/> ";
$b;
函数func($name){
全球10亿美元;
$b=10;
返回$b;
}
$a=&func(“我的名字”);
++$a;
回音“
$a=”.$a.$b=”.$b.“
”;
xdebug_debug_zval('a');回声“
”;
上面的代码输出是以下注意事项:
严格的标准:只有变量应该通过引用在/path/to/file/file.php中的“某些行号”行指定$a=11$b=10
a:(refcount=1,is_ref=0)=11 为什么上面的代码显示通知?为什么会发生抄写呢?
$b;
function &func ($name) {//change here: to return a reference.
global $b;
$b = 10;
return $b;
}
$a =& func("myname");
++$a ;
echo '<br/>$a= '.$a.' $b= ' .$b."<br/>";
xdebug_debug_zval('a'); echo "<br/> ";
$b;
函数&func($name){//change here:返回引用。
全球10亿美元;
$b=10;
返回$b;
}
$a=&func(“我的名字”);
++$a;
回音“
$a=”.$a.$b=”.$b.“
”;
xdebug_debug_zval('a');回声“
”;
上述代码将输出:
$a=11$b=11a:(refcount=1,is_ref=1)=11 为什么这里没有严格的标准通知?这里是参考资料。
$b;
function &func ($name) {
global $b;
$b = 10;
return $b;
}
$a = func("myname"); //change here: removed &
++$a ;
echo '<br/>$a= '.$a.' $b= ' .$b."<br/>";
xdebug_debug_zval('a'); echo "<br/> ";
$b;
函数&func($name){
全球10亿美元;
$b=10;
返回$b;
}
$a=func(“我的名字”)//此处更改:已删除&
++$a;
回音“
$a=”.$a.$b=”.$b.“
”;
xdebug_debug_zval('a');回声“
”;
上述代码将输出:
$a=11$b=10a:(refcount=1,is_ref=0)=11 为什么这里会发生抢劫案?
$b;
function &func ($name) {//change here: to return a reference.
global $b;
$b = 10;
return $b;
}
$a =& func("myname");
++$a ;
echo '<br/>$a= '.$a.' $b= ' .$b."<br/>";
xdebug_debug_zval('a'); echo "<br/> ";
有关xdebug_debug_zval的信息,请访问。
&
PHP中的运算符作为参考在最新版本中被删除。特别是从PHP5。
现在,所有引用类型数据(类等)都通过引用自动传递
阅读并确认您的第二个代码片段工作正常 在PHP中,如果希望通过引用返回,则在赋值时还必须在定义中编写use
&
运算符。看见因此,第二个具有正确的语法,并且在不发出任何警告的情况下工作
第一个代码段给出了警告,因为您尚未定义此函数将返回引用,并且您仍在按引用分配其返回值。所以,这是行不通的。(请参见a
的值增加到11,但b
仅为10。)
在第三个代码段中,您并没有分配引用,所以它并没有给出任何警告。(但是因为这个引用不起作用。(参见
a
和b
的值的区别)我怎么会错过这个:这完全掩盖了我的问题!
来自PHP手册注意:如果您试图从语法为:return($this->value)的函数返回引用;这将不起作用,因为您正试图通过引用返回表达式的结果,而不是变量。您只能通过引用从函数返回变量,其他什么都不能。由于PHP4分支中的PHP4.4.0和PHP5分支中的PHP5.1.0,如果代码试图返回动态表达式或resu,则会发出E_NOTICE错误新接线员的lt
要使用返回的引用,必须使用引用分配:
<?php
function &collector() {
static $collection = array();
return $collection;
}
$collection = &collector();
$collection[] = 'foo';
?>
否,除非您明确定义它,否则它不会通过引用传递。在您提供的链接上,只有您可以看到,他们正在使用&
运算符,因此它通过引用返回。@Pradeep我发布了两个链接。您看到第一个了吗?@Shilpu是的,在第一个链接中,您可以看到他们使用了&
运算符。他们提到了在PHP中,尝试优化传递返回值,但这不会改变行为。