передача PHP по ссылке не работает - PullRequest
1 голос
/ 14 января 2012

Я просто пытаюсь понять передачу по ссылке в PHP, пытаясь найти несколько примеров на php.net.У меня есть один пример прямо здесь, на веб-сайте php, но он не работает:

function foo(&$var)
{
    return $var++;
}

$a=5;
echo foo($a); // Am I not supposed to get 6 here? but I still get 5

Этот пример найден здесь

Может кто-нибудь сказать мне, почемуЯ получил 5 вместо 6 для переменной $ a?

Ответы [ 6 ]

6 голосов
/ 14 января 2012

Ваш код и пример кода не совпадают. Это чудо, что они ведут себя по-разному?

Чтобы увидеть ожидаемое поведение, вы должны изменить $var++ на ++$var.

Что здесь происходит, так это то, что, хотя значение $a равно 6 после возврата функции, возвращаемое значение равно 5 из-за того, как работает оператор постинкрементного увеличения ($var++). Вы можете проверить это с помощью:

$a=5; 
echo foo($a); // returns 5
echo $a; // but prints 6!
1 голос
/ 14 января 2012

Это связано с оператором приращения , а не передачей по ссылке. Если вы посмотрите руководство, вы увидите, что демонстрируете желаемое поведение, вы должны изменить foo() на использование предварительного увеличения вместо постинкрементного, например, так:

function foo(&$var)
{
    return ++$var;
}

Сейчас:

> $a = 5;
> echo foo($a);
6
1 голос
/ 14 января 2012

Поскольку $a++ возвращает $a, то увеличивается на единицу.

Чтобы сделать то, что вы пытаетесь сделать, вам нужно будет сделать ++$a.

http://www.php.net/manual/en/language.operators.increment.php

0 голосов
/ 27 июня 2015

не имеет прямого отношения к вопросу, только к теме.Кажется, что есть ошибка PHP ...

$arr = array();
$arr["one"] = 1;
$arr["two"] = 2;
$arr["three"] = 3;

foreach ($arr as $k => &$v) {
$v += 3;
}

foreach ($arr as $k => $v) {
echo("\n".$k." => ".$v);
}

вывод:

one => 4
two => 5
three => 5

(changing '$v' to '$val' (or some other variable name other than '$v')       
in the second (i.e. last) 'foreach' will result in the expected correct
output (one => 4 two => 5 three => 6)
0 голосов
/ 14 января 2012

Попробуйте повторить фактическую переменную:

echo $a; // 6

Если вы увеличиваете, прежде чем вернуться, ваш пример будет работать, хотя:

return ++$var;
0 голосов
/ 14 января 2012

Нет, это работает просто отлично. $var++ возвращает значение $var, затем увеличивает значение переменной. Таким образом, возвращаемое значение равно 5, что вы echo. Переменная $a теперь обновляется до 6.

...