Это моя установка:
display_startup_errors = на
display_errors = О
error_reporting = E_ALL | E_STRICT
Почему код ведет себя так, как обращается ссылка WRT?
$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 на линии «какой-то номер строки '
$ а = 11 $ Ь = 10
а: (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/> ";
Приведенный выше код выведет:
$ а = 11 $ Ь = 11
а: (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/> ";
Приведенный выше код выведет:
$ а = 11 $ Ь = 10
а: (RefCount = 1, is_ref = 0) = 11
Почему здесь происходит COW?
Для получения информации о xdebug_debug_zval посетите here.
Нет, она не передается по ссылке, если вы явно не определить. На вашей предоставленной ссылке вы можете видеть, что они используют оператор '&', поэтому он возвращается по ссылке. – Pradeep
@ Pradeep Я разместил две ссылки. Вы видели первый? –
@Shilpu Да, в первой ссылке вы видите, что они использовали оператор '&'. Они упомянули, что PHP пытается оптимизировать передаваемое возвращаемое значение, но это не изменит поведение. – Pradeep