Помогите мне понять ссылки на переменные PHP и область видимости - PullRequest
7 голосов
/ 20 января 2011

Ссылка:

  1. Если я передаю переменную в функцию (например, $ var), это должна быть копия ссылки на фактическую переменную (такая, что установка ее в null не влияет на другие копии)?
  2. Или он получает ссылку на то, что является новой копией фактической переменной (например, установка в ноль уничтожает только ее копию)?
  3. Если последнее, копирует ли это объекты и массивы в память? Это хороший способ тратить память и процессорное время, если это так.

Я думаю, что могу понять передачу по ссылке (например, & $ var) правильно, сначала зная, как это работает.

Область:

  1. Что за местная сфера? Прав ли я, заметив, что я могу объявить массив в одной функции, а затем использовать этот массив в других функциях, вызываемых внутри этой функции, БЕЗ передачи ее им в качестве параметра?
  2. Аналогично, позволяет ли объявление в массиве в функции, вызываемой внутри функции, быть доступным в вызывающей программе?
  3. Если нет, то работает ли область видимости с помощью стека вызовов или чего-либо подобного каждой чертовой вещи, которую я понял в программировании, говорит мне, что она должна?

PHP это так весело. (

Ответы [ 3 ]

2 голосов
/ 20 января 2011

Если я передаю переменную в функцию (например, $ var), должна ли она быть копией ссылки на фактическую переменную (так, чтобы установка в ноль не влияла на другие копии)?

Зависит от функции.А также, как вы это называете.Посмотрите на этот пример: http://www.ideone.com/LueFc

Или он получает ссылку на то, что является новой копией фактической переменной (например, установка в ноль уничтожает только ее копию)?

Опять же зависит от функции

Если последнее, копирует ли это объекты и массивы в память?Похоже, это хороший способ тратить память и процессорное время, если так.

Это поможет сэкономить память, чтобы использовать ссылку, конечно.В php> 4 он всегда использует ссылку на объекты, если не указано иное.

Как обстоят дела с локальной областью действия?Прав ли я, заметив, что я могу объявить массив в одной функции, а затем использовать этот массив в других функциях, вызываемых внутри этой функции, БЕЗ передачи ее им в качестве параметра?

Нет, вы не можете.

Аналогично, позволяет ли объявление в массиве в функции, вызываемой внутри функции, быть доступным в вызывающей программе?

Нет, это не так.

Если нет, то работает ли определение объема с помощью стека вызовов или чего-либо подобного каждой чертовой вещи, которую я понял в программировании, говорит мне, что это должно быть?переменная извне функции, перед ее использованием вы должны написать global $outsidevar

1 голос
/ 20 января 2011

если аргумент функции определен как «function my_function ($ variable) {}», то вы получаете копию переменной, и любые изменения, внесенные в переменную внутри вашей функции, не будут доступны вызывающей функции.Вы можете передать переменную по ссылке, добавив амперсанд к аргументу при определении вашей функции, и, таким образом, любые изменения, внесенные в переменную, будут сохранены для вызывающей функции, т.е.*

Передача переменной по ссылке

function myfunction(&$var) {
    $var = 'World';
}
$var = 'Hello';
myfunction($var);
echo $var; // 'World'
1 голос
/ 20 января 2011

Относительно вашего первого набора вопросов:

foo($a);
function foo($b) { echo $b; }

В этом случае $a не будет скопирован в новую переменную $b, только потому, что он передан по значению.

Это потому, что PHP использует концепцию копирования при записи.PHP не будет копировать содержимое переменной, если они не изменены.Вместо этого PHP будет увеличивать свойство refcount существующего zval в $a.

Ну, все не так тривиально, но чтобы ответить на ваш вопрос: нет, он не копирует переменную, если вы не напишите ему в функции и нет, вы не будете экономить процессор и память, используя ссылку.В большинстве случаев ссылка не изменит производительность вообще, но в худшем случае она фактически ухудшит ее (потому что если вариант переменной не is_ref уже существует и ссылка создается, значение переменной должно быть скопированочтобы получить zval с is_ref и один без).Оптимизация кода с использованием ссылок не годится.

...