为什么代码以这种方式表现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)。

在第三个片段中,您不分配参考,因此它不会发出任何警告。 (但是因为这个参考是行不通的(参见ab值的差别)


我怎么会错过这个:这完全是我的问题! 从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