Ссылается на переменную
изучаю PHP, и я столкнулся с вопросом новости переменные, на которые ссылается и не совсем понимаю, как она ведет себя.
function foo(&$var) {
$var++;
}
$a=5;
foo($a);
echo $a; // Retorna 6
Когда я увидел эту функцию, я подумал: "А разве, но если я сделаю звонок с нормальной return $var++
также будет работать...
function bar($var) {
return $var++;
}
$b=5;
bar($b);
echo $b; // Retorna 5
я Не мог понять, очень хорошо, и поведение потому, что от первой функции, выполнять увеличение и второй функции нет.
4 answers
Проще говоря
В Этом первом случае, происходит следующим образом:
function bar($var) {
$var++;
return $var;
}
$b = 5;
echo bar( $b ); // Mostra 6 - valor do return
echo $b; // Mostra 5 - valor do $b
- atríbuido
5
$b
. - вызове функции
bar
, переходя значение5
к ней. - значение
5
, сохраняется$var
, увеличивается. - вы даете echo
$b
, который никогда не переставал быть5
.
, Посмотрите разницу. Я использовал одни и те же переменные, что и в предыдущем случае для упрощения:
function bar( &$var ) {
$var++;
return $var;
}
$b = 5;
echo bar( $b ); // Mostra 6 - valor do return
echo $b; // Mostra 6 - valor do $b
- atríbuido
5
$
b. - вызове функции
bar
, переходя переменная$b
для нее.
(это происходит благодаря&
, схватил достопримечательностей и не значение). -
$b
- же$var
, увеличивается. - вы даете echo
$b
, который был увеличен в пределахbar
(через "альтернативное имя"$var
, который оказался имя$b
в функции).
Короче говоря, в первом случае $var
создается внутри функции значение 5. Во втором случае $var
- $b
с новым названием.
, Усложняя
Я изменил приведенные выше примеры, чтобы использовать одни и те же переменные, и гной прирост в отдельной строке, чтобы не впасть в замешательство:
function bar( &$var ) {
return $var++;
}
$b = 5;
echo bar( $b ); // Mostra 5 - valor do return
echo $b; // Mostra 6 - valor do $b
, Заметили что-то странное? Это то же самое, посмотрите на IDEONE.
Результат странный на первый echo
не имеет ничего общего с ссылкой или нет, и да с того, что мы активизируем $var
ПОСЛЕ return. Если бы это было ++$var
, две линии показали 6.
Хотя это и не часть вопроса, я лучше комментировать, потому что, если функция вопроса была протестирована echo
в свою очередь, может отрицательно сказаться на понимание.
Аннотация: в данном случае, мы провели $b
функции. В функции возвращали $var
, что $b
вне функции, то есть 5
. После return
наносится ++
, усилил $b
(называется $var
внутри функции).
Прохождение ссылается на я считаю, что это одна из самых крутых вещей, которые есть в программировании.
Я считаю, что один из вопросов, которые вы должны сделать при изучении, это -:
- Ссылается на что?
Memoria
Представьте, что когда вы программируете, и делает назначения переменную : $var = 5;
,
не просто присвоение 5 в переменную $var
, это резервируя место
в памяти компьютера, что тера как alias
имя $var
месте, и он будет иметь
значение 5.
0050 | 0051 | 0052 | 0053 | 0054 | 0055 | 0056 <-- possição da memoria
| | $var | | | | <-- alias
| | 5 | | | | <-- valor/referencia
Псевдоним, на самом деле является только бесплатным, чтобы содержимое possição 0052
памяти.
При создании прохода через ссылается вы dissendo, что содержание той possição памяти, не значение, а ссылка на место, что имеет значение. Это сложно, но было бы в основном так :
$b = &$var;
0050 | 0051 | 0052 | 0053 | 0054 | 0055 | 0056 <-- possição da memoria
| | $var | | $b | | <-- alias
| | 5 | | 0052 | | <-- valor/referencia
Теперь, когда вы заходите $b
eĺe не будет отображать 0052
, потому что он ссылается на,
он будет до ссылается и забрать его стоимость в случае 5
.
Таким образом, если содержимое possição 0052
изменяется и $var
$b
будут
изменить. Помните, что вы можете alteralo как $var
$b
.
$var = 7;
0050 | 0051 | 0052 | 0053 | 0054 | 0055 | 0056 <-- possição da memoria
| | $var | | $b | | <-- alias
| | 7 | | 0052 | | <-- valor/referencia
$b = 10;
0050 | 0051 | 0052 | 0053 | 0054 | 0055 | 0056 <-- possição da memoria
| | $var | | $b | | <-- alias
| | 10 | | 0052 | | <-- valor/referencia
Функция
При создании функции, переменные, которые вы создаете в качестве параметра создают possição в памяти, если они не имеют тип ссылки, ее ждут, чтобы получать значение, если имеют тип ссылки забрать ссылается в переменную прошедший.
function teste($a){
}
0080 | 0081 | 0082 | 0083 | 0084 | 0085 | 0086 <-- possição da memoria
| | $a | | | | <-- alias
| | | | | | <-- valor/referencia
teste($var);
0080 | 0081 | 0082 | 0083 | 0084 | 0085 | 0086 <-- possição da memoria
| | $a | | | | <-- alias
| | 5 | | | | <-- valor/referencia
function teste(&$a){
}
0080 | 0081 | 0082 | 0083 | 0084 | 0085 | 0086 <-- possição da memoria
| | $a | | | | <-- alias
| | | | | | <-- valor/referencia
teste($var);
0080 | 0081 | 0082 | 0083 | 0084 | 0085 | 0086 <-- possição da memoria
| | $a | | | | <-- alias
| | 0052 | | | | <-- valor/referencia
Так $a
внутри функции изменяется расположение memoria 0052
, изменив содержание, безусловно.
Функции, где параметры есть &
означает, что вы должны передать переменную со значением просто не работает. Передача по ссылке означает, что переменная передается будет иметь свое значение изменяется по функции, если она будет разрушен внутри функции, и вы сделаете algumação действие в нем после выполнения, будет создано сообщение об ошибке.
function foo(&$var) {
$var++;
}
foo(5);//erro.
Прохождение аргумента по значению означает, что переменная или значение прошлом копируется функцию, и его "оригинал" будет продолжена без модификация.
Пример 1
function porReferencia(&$arg){
$arg = 'modificado por referência';
}
$argOriginal = 'original';
referencia($argOriginal);
echo $argOriginal; //modificado por referência
Пример 2
function porValor($arg){
$arg = 'modificado por valor';
return $arg;
}
$arg = 'original';
porValor($arg);
echo $arg; //original
С некоторыми исключениями, функция должна изменять только те значения, которые передаются в качестве аргумента(копия) и его внутренних переменных, а не переменные вне ее масштабы(глобальные), изменения должны быть возвращены, поэтому не теряет первоначального содержимого, если это необходимо, использует его или сравнивает его, как в примере 2
И В другие языки, можно собрать интересный пример, где вы передать переменную или объект для функции/метода, и внутри него так же, в ссылку, после вызова пытается получить доступ к этой переменной и ошибки, в целом, заявив, что определить, что никогда не существовало.
Мне потребовалось лет, чтобы понять, почему всегда я избегал использования, а также не понимает практического использования в реальных ситуациях. А также, что не проявил интерес.
, Я всегда видел примеры с параметрами в функции function foo(&$var) {
, но я не понимала, почему использовать это, потому что я могу сделать, используя global
и статические свойства класса.
Несколько лет назад, я видел пример использования очень разные и просто, используя array. То, что я проснулся интерес, чтобы использовать эту функцию параметров по ссылке.
Пример массива, который я видел, было что-то вроде этого:
$arr = array(0 => 'a', 1 => 'b', 2 => 'c');
print_r($arr);
/*
Array
(
[0] => a
[1] => b
[2] => c
)
*/
$foo = &$arr[0];
$foo = 'a modified';
print_r($arr);
/*
Array
(
[0] => a modified
[1] => b
[2] => c
)
*/
Посмотрите, как $foo
начинает действовать как ссылка или как ярлык (псевдоним) массива, который получил заявление.
Что-нибудь, что $foo
появиться, будет "зеркальный" непосредственно в $arr[0]
.
Это упрощает обработку массивов многомерных.
Других различных целей, как отмечалось в других ответах.
Подумайте, Когда в назначений по ссылке, всегда представьте себе переменную "fake", где значение-это просто ссылку на адрес памяти, то есть, псевдоним (ярлык).