1

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

为什么一头牛在这里发生?

有关 xdebug_debug_zval 的信息,请访问此处

4

3 回答 3

1

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

阅读返回引用通过引用传递

于 2011-12-23T21:39:24.327 回答
1

您的第二个片段工作正常。

在 PHP 中,如果你想通过引用返回,你必须&在分配时在定义中编写 use 运算符。请参阅PHP 参考文档。因此, 2nd 具有正确的语法,并且它在没有任何警告的情况下工作。

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

在第三个片段中,您没有分配参考,因此它没有给出任何警告。(但由于这个引用不起作用。(见a's 和b' 值的差异)

于 2011-12-23T21:53:01.543 回答
1

我怎么会错过这个:这完全使我的问题静音!来自PHP 手册的返回参考

注意:如果您尝试使用以下语法从函数返回引用:return ($this->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';
?>
于 2011-12-23T21:55:41.177 回答