为什么代码以这种方式表现WRT引用返回?
这是我的设置:
display_startup_errors = on
display_errors = On
error_reporting = E_ALL | E_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/> ";
以上代码输出的注意事项如下:
严格的标准:只有变量应该通过/path/to/file/file.php中的'某些行号'
$ a = 11 $ b = 10
a:(refcount = 1,is_ref = 0)= 11
为什么上面的代码显示通知? 为什么有一个COW(正在撰写副本)发生?
$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/> ";
上面的代码将输出:
$ a = 11 $ b = 11
a:(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/> ";
上面的代码将输出:
$ a = 11 $ b = 10
a:(refcount = 1,is_ref = 0)= 11
为什么COW会在这里举行?
有关xdebug_debug_zval的信息,请访问此处。
在PHP中作为参考的&
运算符在最近的版本中被删除。 特别是从PHP5开始。 现在所有的引用类型数据(类等)都通过引用自动传递。
阅读返回引用和通过引用传递
您的第二个代码段正常工作。
在PHP中,如果你想通过引用返回,你必须在分配时在定义中编写use &
operator。 请参阅PHP参考文档。 因此,2nd有正确的语法,它没有给出任何警告。
由于您尚未定义此函数将返回引用,并且您仍在通过引用分配其返回值,因此第一个代码段将发出警告。 所以,它不会工作。 (见a
的值增加到11,但b
只有10)。
在第三个片段中,您不分配参考,因此它不会发出任何警告。 (但是因为这个参考是行不通的(参见a
和b
值的差别)
我怎么会错过这个:这完全是我的问题! 从PHP返回参考手册
注意:如果尝试使用以下语法从函数返回引用:return($ this-> value); 这不会起作用,因为您试图通过引用返回表达式的结果而不是变量。 你只能通过函数的引用返回变量 - 没有别的。 从PHP 4分支中的PHP 4.4.0和PHP 5分支中的PHP 5.1.0开始,如果代码尝试返回动态表达式或新运算符的结果,则会发出E_NOTICE错误。
To use the returned reference, you must use reference assigment:
<?php
function &collector() {
static $collection = array();
return $collection;
}
$collection = &collector();
$collection[] = 'foo';
?>
链接地址: http://www.djcxy.com/p/58919.html
上一篇: why is the code behaving this way WRT reference return?
下一篇: Set errno value in C