<?php
function foo(&$var)
{
$var++;
}
$a=5;
foo($a);
echo $a;
?>
Выведет 6. Как тут работает ссылка &$var? Ведь, нигде нет присвоения. Чему она присваивается?
И ещё, вот немного модифицированный код:
<?php
function foo($var) {
$var++;
return $var;
}
$a=5;
foo($a);
echo $a;
?>
Почему он возвращает 5? Есть функция инкремента переменной $var. Я объявляю $a = 5, отправляю $a в функцию, функция делает ++ и возвращает (return) получившийся (инкрементированный) $a, равный 6, и я вывожу его при помощи echo. А выводится 5. Почему?
Спустя 3 минуты, 55 секунд (11.07.2011 - 18:43) waldicom написал(а):
1. & означает, что передается не копия переменной, а её физический адрес. Поэтому присвоения не нужны.
2. Функция возвращает число 6, но ничему не присваевается. Если нужно увидеть 6, то можн так:
2. Функция возвращает число 6, но ничему не присваевается. Если нужно увидеть 6, то можн так:
echo foo($a);
$b = foo($a);
echo $b;
Спустя 55 секунд (11.07.2011 - 18:43) pak написал(а):
<?php
function foo($var) {
return $var++;
}
$a=5;
foo($a);
echo $a;
?>
Спустя 49 минут, 8 секунд (11.07.2011 - 19:33) alex455 написал(а):
pak, ваш пример выводит 5, а не 6. Но с этим разобрался, спасибо.
Вот чего не могу понять, так это ссылки. На php.su читал, и в книге, и первый ответ в этой треде, но ничего так и не понял.
что здесь значит &$var и чем эта строка отличается от
?
Вот чего не могу понять, так это ссылки. На php.su читал, и в книге, и первый ответ в этой треде, но ничего так и не понял.
function foo(&$var)
что здесь значит &$var и чем эта строка отличается от
function foo($var)
?
Спустя 1 час, 32 минуты, 9 секунд (11.07.2011 - 21:05) Winston написал(а):
Запусти этот пример, может поймешь
&$var значит, что значение будет браться и сохранятся в ячейке памяти.
Свернутый текст
function a($var)
{
return ++$var;
}
$var = 5;
echo a($var);
echo '<br/>' . $var;
echo '<br/>----------------------<br/>';
function b(&$var)
{
return ++$var;
}
$var2 = 5;
echo b($var2);
echo '<br/>' . $var2;
&$var значит, что значение будет браться и сохранятся в ячейке памяти.
Спустя 1 час, 4 минуты, 5 секунд (11.07.2011 - 22:09) Лена написал(а):
Передаем в функцию некие данные, возвращаем результат. Результат присваиваем переменной - т.е. занимаем для наших данных память:
Передаем в функцию некие данные. Результат работы функции автоматом пишется в переменную, которую мы передаем ей как аргумент(передаем по ссылке). Память под возвращаемые данные уже отведена, значит, результат работы функции не надо присваивать переменной:
Можно еще объявить переменную как глобальную:
Но. Этот вариант плохой.
$a=5;
function foo($var)
{
return $var++;
}
$a2 = foo($a);
echo $a2 . "------------1<br />";
Передаем в функцию некие данные. Результат работы функции автоматом пишется в переменную, которую мы передаем ей как аргумент(передаем по ссылке). Память под возвращаемые данные уже отведена, значит, результат работы функции не надо присваивать переменной:
function foo2(&$var)
{
return $var++;
}
echo foo2($a) . "------------2<br />";
Можно еще объявить переменную как глобальную:
function foo3()
{
global $a;
return $a++;
}
echo foo3() . "------------3<br />";
Но. Этот вариант плохой.
Спустя 56 минут, 17 секунд (11.07.2011 - 23:05) alex12060 написал(а):
alex455
Понимаешь, когда ты создаешь переменную, то ты забиваешь в нее число, строку, массив, в общем, какие-то данные, да?
А ты задумайся, где они хранятся и как к ним идет доступ...
Когда ты пишешь:
то ты записываешь в ячейку памяти пустоту, т.е бронируешь ее, и говоришь другим, что она твоя. Это как с аськами, ты получаешь некий юин, и твой юин никто уже не займет.
В общем, ссылка, это непосредственное изменение ячейки памяти без предварительной "извлекаловки" из нее значения.
Не, по идее, ты извлекаешь, просто пользоваться переменной не надо.
Допустим, у тебя есть шляпа, не твоя, а вредного соседа. Тебе охотно в ней сделать дырку. Есть 2 способа, как ты ее проделаешь:
(2 пункт не повторять, ну и первый тоже)
в общем, я, если честно, особой нужности не вижу в ссылках, но часто их применяют для ускорения программных скриптов, т.к меньше операций нужно для получения результата.
Не знаю, вроде разжевал, помог надеюсь :)
Возможны недочеты, если что, поправьте меня.
Понимаешь, когда ты создаешь переменную, то ты забиваешь в нее число, строку, массив, в общем, какие-то данные, да?
А ты задумайся, где они хранятся и как к ним идет доступ...
Когда ты пишешь:
$a = '';
то ты записываешь в ячейку памяти пустоту, т.е бронируешь ее, и говоришь другим, что она твоя. Это как с аськами, ты получаешь некий юин, и твой юин никто уже не займет.
В общем, ссылка, это непосредственное изменение ячейки памяти без предварительной "извлекаловки" из нее значения.
Не, по идее, ты извлекаешь, просто пользоваться переменной не надо.
Допустим, у тебя есть шляпа, не твоя, а вредного соседа. Тебе охотно в ней сделать дырку. Есть 2 способа, как ты ее проделаешь:
- Возьмешь шляпу, посмотришь на нее, порежешь ее и положишь обратно.
- Возьмешь винтовку и просто выстрелишь в нее, когда сосед будет в ней.
(2 пункт не повторять, ну и первый тоже)
в общем, я, если честно, особой нужности не вижу в ссылках, но часто их применяют для ускорения программных скриптов, т.к меньше операций нужно для получения результата.
Не знаю, вроде разжевал, помог надеюсь :)
Возможны недочеты, если что, поправьте меня.
Спустя 12 минут, 59 секунд (11.07.2011 - 23:18) waldicom написал(а):
Цитата (alex12060 @ 11.07.2011 - 21:05) |
Не знаю, вроде разжевал, помог надеюсь |
Если я скажу, что большей чуши я не слышал, я не сильно тебя обижу?
Спустя 16 часов, 28 минут, 12 секунд (12.07.2011 - 15:46) alex12060 написал(а):
waldicom
возможно не обидишь)
возможно не обидишь)
Спустя 6 минут, 6 секунд (12.07.2011 - 15:52) kristall написал(а):
Лучше так:
Возможно у тебя есть вредный сосед. Ты можешь сделать дырку непосредственно в нем (по ссылке), а можешь наделать его клонов и дырявить их (по значению).
Возможно у тебя есть вредный сосед. Ты можешь сделать дырку непосредственно в нем (по ссылке), а можешь наделать его клонов и дырявить их (по значению).
Спустя 3 часа, 5 минут, 58 секунд (12.07.2011 - 18:58) alex455 написал(а):
Я понял, что такое ссылка, когда она ссылается на что-то.
Например,
Здесь $a - это лишь другое название $b.
Но не могу понять, как работают такие ссылки в функциях.
Например,
$a = &$b;
Здесь $a - это лишь другое название $b.
Но не могу понять, как работают такие ссылки в функциях.
Цитата |
&$var значит, что значение будет браться и сохранятся в ячейке памяти. |
А $var тогда где будет сохраняться, если не в ячейке памяти?
function a($var)
{
return ++$var;
}
$var = 5;
echo a($var);
echo '<br/>' . $var;
echo '<br/>----------------------<br/>';
function b(&$var)
{
return ++$var;
}
$var2 = 5;
echo b($var2);
echo '<br/>' . $var2;
Объясните мне этот пример.
В первой функции "echo a($var);" значит, что мы выводим обработку $var, которая равна 5 - мы подставляем 5 в функцию a в первый аргумент, который есть $var, то есть внутри функции $var == 5. И мы возвращаем 5+1. Это понятно и не сложно.
Во второй функции мы вызываем её для числа 5, то есть подставляем в функцию число 5 в первый аргумент, который является ... ссылкой! Вот тут я и стопорюсь. Ссылкой КУДА??? На что? Я вообще не понимаю дальнейшей логики интерспретатора. Если мы имеем
$a = &$b;
то понятно - это указание для $a, что $a - это лишь второе название $b, вот и всё. Может, я тут что-то не понимаю? Как я выучил, "&" - это указание не той переменной, у которой "&" стоит, а той, что слева. В итоге просто запись
&$b;
не имеет значения, так как здесь нет ссылки, есть лишь указание, на что ссылаться, но ЧЕМУ на это ссылаться - этого нет. А в функции с параметром-ссылкой я этого и не понимаю.
Или так... Возмём функцию:
function b(&$var)
{
return ++$var;
}
$var2 = 5;
echo b($var2);
echo '<br/>' . $var2;
Тут происходит следующее:
раз $var2 == 5, значит, мы имеем
echo b(5);
b - функция с аргументом &$var, то есть происходит присвоение, в точности описываемое этим:
5 = &$var;
Ну, 5 у нас это $var2, то есть получается
$var2 = &$var;
то есть $var2 - это второе имя &$var.
Правильно?
Спустя 4 часа, 7 минут, 32 секунды (12.07.2011 - 23:06) Лена написал(а):
--$a - это лишь другое название $b.
Нет. $b - копия $a, $b - другое название $a, другое имя $a.
$a = &$b;
$a = &$c;
Теперь у $a два названия, два разных имени. Если у $a есть значение, доступ к нему мы можем получить, используя $b или $c.
Объясняю, как это понимаю я. Есть у нас память. Создали переменную $a - забили для нее память($a = '';), создали переменную $b($b = '';) - забили память и для нее.
Сейчас и у $a, и у $b значение - пустая строка(''). В памяти заняли две ячейки.
Но. Допустим, мы хотим, чтобы при изменении $a менялось и $b($a = 'asdf';). Тогда мы ставим &. Теперь и $а, и $b ссылаются на одно значение, одно место в памяти, т.е. если
$a = 'asdf';
$a = &$b;
то $b тоже будет равно 'asdf', т.е. будет ссылаться на то же значение, которое занимает какую-то ячейку памяти.
Про функции.
function b(&$var)
{
return ++$var;
}
$var2 = 5;
echo b($var2);
echo '<br/>' . $var2;
Здесь $var2 = &$var; $var - копия $var2. Если $var внутри функции меняется, потому как это ее аргумент и все аргументы внутри функции могут меняться, $var2 тоже будет меняться, потому что ссылается на то же значение.
Но. Если значение $var за пределами функции не видно(это же аргумент, у него локальная видимость, только внутри функции), то значение $var2 за пределами функции будет существовать, потому что мы эту переменную создали вне тела функции.
--то есть $var2 - это второе имя &$var.
--Правильно?
Нет. $var второе имя $var2.
Нет. $b - копия $a, $b - другое название $a, другое имя $a.
$a = &$b;
$a = &$c;
Теперь у $a два названия, два разных имени. Если у $a есть значение, доступ к нему мы можем получить, используя $b или $c.
Объясняю, как это понимаю я. Есть у нас память. Создали переменную $a - забили для нее память($a = '';), создали переменную $b($b = '';) - забили память и для нее.
Сейчас и у $a, и у $b значение - пустая строка(''). В памяти заняли две ячейки.
Но. Допустим, мы хотим, чтобы при изменении $a менялось и $b($a = 'asdf';). Тогда мы ставим &. Теперь и $а, и $b ссылаются на одно значение, одно место в памяти, т.е. если
$a = 'asdf';
$a = &$b;
то $b тоже будет равно 'asdf', т.е. будет ссылаться на то же значение, которое занимает какую-то ячейку памяти.
Про функции.
function b(&$var)
{
return ++$var;
}
$var2 = 5;
echo b($var2);
echo '<br/>' . $var2;
Здесь $var2 = &$var; $var - копия $var2. Если $var внутри функции меняется, потому как это ее аргумент и все аргументы внутри функции могут меняться, $var2 тоже будет меняться, потому что ссылается на то же значение.
Но. Если значение $var за пределами функции не видно(это же аргумент, у него локальная видимость, только внутри функции), то значение $var2 за пределами функции будет существовать, потому что мы эту переменную создали вне тела функции.
--то есть $var2 - это второе имя &$var.
--Правильно?
Нет. $var второе имя $var2.
Спустя 8 часов, 40 минут, 43 секунды (13.07.2011 - 07:47) linker написал(а):
function b(&$var)Аргумент $var функции b будет ссылать на переменную $var2. Это равносильно записи
{
return ++$var;
}
$var2 = 5;
echo b($var2);
echo '<br/>' . $var2;
$var = &$var2;Этот же код равен
function b($var)
{
return ++$var;
}
$var2 = 5;
echo b(&$var2);
echo '<br/>' . $var2;
Спустя 1 день, 8 часов, 24 минуты, 52 секунды (14.07.2011 - 16:11) alex455 написал(а):
А если мы хотим сделать ссылку на функцию, мы ставим амперсанд 2 раза - один при объявлении функции, а другой - при присвоении по ссылке? Если указать функцию без символа амперсанда перед ней, а потом присвоить эту функцию по ссылке с применением амперсанда (=&), то это будет некорректно?