@rdt09

Передача значения по ссылке. В чём проблема?

Есть вот такая упрощённая программа:
function func(array $par) {
	$par[0] += 5;
	echo $par[0] . "<br>";
}

$var = 10;
func(array(&$var));
echo $var . "<br>";

Переменная передаётся в функцию в массиве по ссылке.
Результат:
15
15

Параметр $par сохраняет связь с переменной $var.

Теперь, допустим, перед передачей переменной необходимо выполнить проверку на её существование. Можно попробовать сделать это так:
$var = 10;
func(array(isset($var)? &$var : 0));     // Ошибка!
echo $var . "<br>";

Но операция получения адреса в условном операторе не работает, поэтому такой код выдаст ошибку.

Можно немного схитрить и воспользоваться присваиванием по ссылке, получится такой код:
$var = 10;
func(array(isset($var)? $temp =& $var : 0));
echo $var . "<br>";

Результат:
15
10

Как видим, значение действительно передалось, но связь между $par и $var потеряна. Можно, конечно, сначала выполнить проверку, а потом уже вызов функции как в первом примере. Но мне всё-таки интересно - что не так с этим кодом, почему он не работает?
  • Вопрос задан
  • 5473 просмотра
Пригласить эксперта
Ответы на вопрос 1
Передача параметра функции в качестве ссылки вызывало предупреждение в 5.3 и фатальную ошибку 5.4. Подробнее по ссылке, цитирую:
Замечание: В вызове функции отсутствует знак ссылки - он есть только в определении функции. Этого достаточно для корректной передачи аргументов по ссылке. Начиная с PHP 5.3.0, вы можете получить предупреждение о том, что передача переменной по ссылке устарела, если используете & в foo(&$a);. Начиная с PHP 5.4.0 передача переменной по ссылке стала невозможна, поэтому использование этого приема приведет к фатальной ошибке.


Корректнее в объявлении функции принимать значения по ссылке:
function func(array &$par) {
  $par[0] += 5;
  echo $par[0] . "<br>";
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы