为什么代码表现为这种方式WRT引用返回?

时间:2011-12-23 21:18:09

标签: php copy-on-write reference

这是我的设定:
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

为什么以上代码显示通知?为什么会出现C.O.W(写入时复制)?

$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

为什么C.O.W会在这里举行?

有关xdebug_debug_zval的信息,请访问here

3 个答案:

答案 0 :(得分:1)

PHP中的

&运算符作为参考在最近的版本中被删除。特别是来自 PHP5 。 现在所有引用类型数据(类等)都通过引用自动传递。

阅读Returning ReferencesPassing by Reference

答案 1 :(得分:1)

您的第二个代码段工作正常。

在PHP中,如果要通过引用返回,则必须在分配时在定义中编写use &运算符。见PHP reference Doc。因此,2nd具有正确的语法,并且在没有给出任何警告的情况下正在工作。

第一个代码段正在发出警告,因为您尚未定义此函数将返回引用,并且您仍然通过引用分配其返回值。所以,它不会起作用。 (请参阅a的值增加到11,但b仅为10。)

在第三个片段中,您没有分配参考,因此它没有给出任何警告。 (但由于此引用不起作用。(请参阅ab的值的差异)

答案 2 :(得分:1)

我到底怎么回事:这完全打乱了我的问题! 来自Returning References的PHP手册

  

注意:如果您尝试使用以下语法从函数返回引用:return($ this-&gt; value);这不会起作用,因为您试图通过引用返回表达式的结果而不是变量。您只能通过函数引用返回变量 - 没有别的。由于PHP 4分支中的PHP 4.4.0和PHP 5分支中的PHP 5.1.0,如果代码尝试返回动态表达式或new运算符的结果,则会发出E_NOTICE错误。

To use the returned reference, you must use reference assigment:

<?php
function &collector() {
  static $collection = array();
  return $collection;
}
$collection = &collector();
$collection[] = 'foo';
?>