これは私の設定です:
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 の詳細については、こちらをご覧ください。