почему код ведет себя так, что WRT возвращает ссылку? - PullRequest
1 голос
/ 24 декабря 2011

Это мои настройки:display_startup_errors = ondisplay_errors = Onerror_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 on line 'какой-то номер строки '$ a = 11 $ b = 10a: (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 = 11a: (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 = 10a: (refcount = 1, is_ref = 0) = 11

Почему здесь происходит COW?

Для получения информации о посещении xdebug_debug_zval здесь .

Ответы [ 3 ]

1 голос
/ 24 декабря 2011

Ваш второй фрагмент работает правильно.

В PHP, если вы хотите вернуться по ссылке, вы должны написать оператор & в определении, а также при назначении.см. справочник PHP Doc .Следовательно, 2nd имеет правильный синтаксис и работает без каких-либо предупреждений.

Первый фрагмент выдает предупреждение, поскольку вы не определили, что эта функция будет возвращать ссылку, и вы по-прежнему назначаете ее возвращаемое значение по ссылке.Так что это не сработает.(см. значение a увеличивается до 11, но b - только 10).

В третьем фрагменте вы не назначаете ссылку, поэтому она не выдает никакого предупреждения.(Но из-за этой ссылки это не сработает. (См. Разницу в значениях a и b)

1 голос
/ 24 декабря 2011

Как, черт возьми, я пропустил это: это полностью заглушает мой вопрос!с Возврат ссылок в руководстве по PHP

Примечание. Если вы попытаетесь вернуть ссылку из функции с синтаксисом: return ($ this-> value);это не будет работать, так как вы пытаетесь вернуть результат выражения, а не переменной, по ссылке.Вы можете возвращать переменные только по ссылке из функции - больше ничего.Поскольку PHP 4.4.0 в ветви PHP 4 и PHP 5.1.0 в ветви PHP 5, выдается ошибка E_NOTICE, если код пытается вернуть динамическое выражение или результат оператора new.

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

<?php
function &collector() {
  static $collection = array();
  return $collection;
}
$collection = &collector();
$collection[] = 'foo';
?>
1 голос
/ 24 декабря 2011

& оператор в PHP как ссылка удален в последних версиях.Специально от PHP5 .Теперь все данные ссылочного типа (класс и т.д.) автоматически передаются по ссылке.

Чтение Возвращение ссылок и Передача по ссылке

...