Возвращаемое значение функции php неожиданно - PullRequest
1 голос
/ 08 августа 2011

Мне нужна помощь в понимании этого примера кода PHP:

$bar = "outside";
function foo($bar) {
  $bar = "inside";
  return $bar;
}
$bar = foo($bar);
echo $bar

Я предсказывал, что $ bar будет эхом "снаружи", но он эхом "внутри", и я не понимаю, почему. $ bar изначально имеет значение "outside" (определенное как глобальное). Затем вызывается функция foo (сразу после ее определения) и принимает параметр, который также называется $ bar. $ bar было присвоено значение "outside", поэтому значение "outside" передается в foo. Тогда у нас есть выражение $ bar = "inside", которое для меня не имеет смысла, потому что кажется, что оно означает "outside" = "inside", и как вы можете присвоить строку другой строке? Затем функция возвращает $ bar, которая, я думаю, должна иметь значение "outside", поскольку именно это было передано в foo. Как он приобрел значение «внутри», я не могу понять.

Редактировать : Мой вопрос не о переменной области видимости. Что мне интересно, так это то, почему значение параметра не передается функции в строке 3, давая бессмысленный оператор "outside" = "inside". Основываясь на полученных мною ответах, я могу только предположить, что это потому, что такое утверждение недопустимо в PHP (и, вероятно, во всех других языках), поэтому интерпретатор просто не делает этого (несмотря на то, что нормально интерпретатора * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Поведение - это замена параметров, где бы они ни находились

Спасибо

Ответы [ 3 ]

1 голос
/ 08 августа 2011

Ну, я не эксперт по PHP, но я работал с несколькими другими языками, поэтому позвольте мне сделать попытку:

Когда функция начинает выполнение, переменная $ bar является локальной для функции (вы не ссылаетесь на глобальный $ bar в строке 3). Вы устанавливаете эту локальную переменную на "inside" и возвращаете ее. Глобальный $ bar затем устанавливается на это возвращаемое значение "inside".

Вы можете увидеть эту работу, если вы измените объявление функции на:

function foo($bid) {
    $bid = "inside";
    return $bid;
}

основываясь на комментариях, которые вы публиковали на другие вопросы, я хотел бы кое-что добавить:

Когда вы видите «$ bid» где-то в коде, происходит не подстановка переменных, а оценка переменных. В случае, когда знак равенства находится в правой части этой «оценки», компилятор знает «не оценивать, установить». Принимая во внимание, что, когда знак равенства находится на левой стороне переменной, это вычисляется. Компилятор знает функцию по-разному, когда переменная находится слева или справа от знака равенства.

1 голос
/ 08 августа 2011

Ваша строка $bar = "inside"; переназначает значение $bar.Таким образом, независимо от того, какое значение вы передаете, $bar присваивается значение "inside".

0 голосов
/ 08 августа 2011

1:

$bar = "outside";
function foo($bar) {
    $bar = "inside";
    return $bar;
}
$bar = foo($bar);
echo $bar // **echo's inside**

2:

$bar = "outside";
function foo($bar) {
    GLOBAL $bar;
    $bar = "inside";
    return $bar;
}
$bar = foo($bar);
echo $bar  // **echo's inside**

3:

$bar = "outside";
function foo($bar) {

  $bar = "inside";
  GLOBAL $bar;
  return $bar;
}
$bar = foo($bar);
echo $bar //  **echo's outside**
...