[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Объясните про ссылки
alex455
<?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, то можн так:
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 читал, и в книге, и первый ответ в этой треде, но ничего так и не понял.
function foo(&$var)

что здесь значит &$var и чем эта строка отличается от
function foo($var)

?

Спустя 1 час, 32 минуты, 9 секунд (11.07.2011 - 21:05) Winston написал(а):
Запусти этот пример, может поймешь
Свернутый текст
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

Понимаешь, когда ты создаешь переменную, то ты забиваешь в нее число, строку, массив, в общем, какие-то данные, да?

А ты задумайся, где они хранятся и как к ним идет доступ...

Когда ты пишешь:


$a = '';


то ты записываешь в ячейку памяти пустоту, т.е бронируешь ее, и говоришь другим, что она твоя. Это как с аськами, ты получаешь некий юин, и твой юин никто уже не займет.

В общем, ссылка, это непосредственное изменение ячейки памяти без предварительной "извлекаловки" из нее значения.

Не, по идее, ты извлекаешь, просто пользоваться переменной не надо.

Допустим, у тебя есть шляпа, не твоя, а вредного соседа. Тебе охотно в ней сделать дырку. Есть 2 способа, как ты ее проделаешь:
  • Возьмешь шляпу, посмотришь на нее, порежешь ее и положишь обратно.
  • Возьмешь винтовку и просто выстрелишь в нее, когда сосед будет в ней.

(2 пункт не повторять, ну и первый тоже)

в общем, я, если честно, особой нужности не вижу в ссылках, но часто их применяют для ускорения программных скриптов, т.к меньше операций нужно для получения результата.

Не знаю, вроде разжевал, помог надеюсь :)
Возможны недочеты, если что, поправьте меня.

Спустя 12 минут, 59 секунд (11.07.2011 - 23:18) waldicom написал(а):
Цитата (alex12060 @ 11.07.2011 - 21:05)
Не знаю, вроде разжевал, помог надеюсь smile.gif

Если я скажу, что большей чуши я не слышал, я не сильно тебя обижу?

Спустя 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.

Но не могу понять, как работают такие ссылки в функциях.

Цитата
&$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.

Спустя 8 часов, 40 минут, 43 секунды (13.07.2011 - 07:47) linker написал(а):
function b(&$var)
{
return ++$var;
}

$var2 = 5;
echo b($var2);
echo '<br/>' . $var2;
Аргумент $var функции b будет ссылать на переменную $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 раза - один при объявлении функции, а другой - при присвоении по ссылке? Если указать функцию без символа амперсанда перед ней, а потом присвоить эту функцию по ссылке с применением амперсанда (=&), то это будет некорректно?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.