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 行 'some line number'
$a= 11 $b= 10
a: (refcount=1, is_ref=0)=11の参照によって変数のみを割り当てる必要があります

上記のコードで通知が表示されるのはなぜですか? また、なぜ COW (copy on write) が行われるのでしょうか?

$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 の詳細については、こちらをご覧ください

4

3 に答える 3

1

&参照としてのPHPの演算子は、最近のバージョンでは削除されています。特にPHP5から。これで、すべての参照型データ(クラスなど)が自動的に参照によって渡されます。

参照の返却と参照による受け渡しを読む

于 2011-12-23T21:39:24.327 に答える
1

2 番目のスニペットは正しく機能しています。

PHPで参照渡ししたい場合は&代入時にuse演算子も定義に書く必要があります。PHP リファレンス Docを参照してください。したがって、2nd には正しい構文があり、警告を表示することなく動作しています。

この関数が参照を返すことを定義していないにもかかわらず、参照によって戻り値を割り当てているため、最初のスニペットは警告を発しています。だから、それはうまくいきません。(aの値は 11 に増分されますが、b10 のみです。)

3番目のスニペットでは、参照を割り当てていないため、警告は出ていません。(しかし、この参照のために機能しません。(abの値の違いを参照してください)

于 2011-12-23T21:53:01.543 に答える
1

一体どうしてこれを見逃したのですか。これは私の質問を完全にミュートします! PHP マニュアルのReturning Referencesから

注: 次の構文を使用して関数から参照を返そうとする場合: 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 に答える