[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Ссылка &
NierRa
Добрый день форумчане!


function tempFunction($var) {
//тело функции
}

tempFunction(&$temp);



В кратце напомню - & является так называемой ссылкой на переменную. То есть говоря проще мы передаем не значение переменной, а ссылку на ее.

Кто может подсказать адекватный пример применения? Сколько читаю форумы, люди пишут, что практически нет задач, которых нельзя было бы решить без этого.
Просто хочется знать нужно ли это где-то реально



Спустя 8 минут, 15 секунд (26.07.2012 - 02:44) dev написал(а):
разве не?
function tempFunction(&$var) {
//тело функции
}

tempFunction($temp);

Спустя 18 минут, 15 секунд (26.07.2012 - 03:02) NierRa написал(а):
dev
А толку ставить ссылку перед локальной переменой. Она за пределы функции не видит.

Для более наглядного примера:
$a = 10;

если адаптировать на "человеческий язык":

1. tempFunction($temp); - это будет tempFunction(10);
2. tempFunction(&$temp); - это будет tempFunction(путь, где находитсся переменная);

Соответственно, при первом варианте "оригинальная" переменная остается неизменной, при втором, ее значение может измениться в результате работы функции.

Если адаптировать на "человеческий" язык твой вопрос, то это будет

tempFunction(&10) - что не имеет смысла


Спустя 3 часа, 10 минут, 6 секунд (26.07.2012 - 06:12) Tadochi написал(а):
$a=5;

function tempFunction(&$var)
{
$a++;
}

tempFunction(&$a);
echo $a; // unsure.gif

Спустя 20 минут, 48 секунд (26.07.2012 - 06:33) NierRa написал(а):
Этот пример я в курсе rolleyes.gif
Есть что-то более существенное, нежели инкрементация

Спустя 7 минут, 32 секунды (26.07.2012 - 06:41) Tadochi написал(а):
$db=mysql_connect(...);
function lol(&$db)
{
mysql_close($db);
}
biggrin.gif

Спустя 25 минут, 20 секунд (26.07.2012 - 07:06) NierRa написал(а):
Это все несерьезно rolleyes.gif

Спустя 2 часа, 36 минут, 22 секунды (26.07.2012 - 09:42) Winston написал(а):
Свернутый текст
# Борьба с магическими кавычками      

if (get_magic_quotes_gpc())
{
function stripslashes_deep($value)
{
if( is_array($value) )
{
$value = array_map('stripslashes_deep', $value);
}
elseif ( !empty($value) && is_string($value) )
{
$value = stripslashes($value);
}
return $value;
}

stripslashes_deep(&$_GET);
stripslashes_deep(&$_POST);
stripslashes_deep(&$_COOKIE);
stripslashes_deep(&$_REQUEST);
}

Если не будешь использовать ссылку, то нужно было бы писать
$_GET     = stripslashes_deep($_GET);
$_POST = stripslashes_deep($_POST);
$_COOKIE = stripslashes_deep($_COOKIE);
$_REQUEST = stripslashes_deep($_REQUEST);

Спустя 42 минуты, 21 секунда (26.07.2012 - 10:25) inpost написал(а):
я использовал ссылки в случае рекурсий, таким образом переменная наполнялась данными. Делал обход каталогов, сбор ссылок на файлы и помещал в общий архив. То есть бекап всех файлов.
Ссылка - сокращенная запись, чтобы не писать ретурн...

Спустя 1 час, 6 минут, 48 секунд (26.07.2012 - 11:32) NierRa написал(а):
Спасибо за ответы rolleyes.gif

Спустя 3 часа, 54 минуты, 3 секунды (26.07.2012 - 15:26) killer8080 написал(а):
Цитата (NierRa @ 26.07.2012 - 03:02)
dev
А толку ставить ссылку перед локальной переменой. Она за пределы функции не видит.
Цитата
Устаревшие возможности:

  • Присвоение по ссылке возвращаемого значения оператором new является устаревшим.
  • Передача по ссылке во время исполнения считается устаревшим способом.


Спустя 13 минут, 42 секунды (26.07.2012 - 15:39) neadekvat написал(а):
Указатели и ссылки имеют смысл, например, в Си, где в принципе невозможно вернуть, например, массив или структуру, в привычном виде (return), поэтому приходится передавать их в функцию таким образом.

В php это на самом деле особого смысла не имеет. Что подтвердил пруфом killer8080

Спустя 4 часа, 7 минут, 22 секунды (26.07.2012 - 19:47) killer8080 написал(а):
Цитата (neadekvat @ 26.07.2012 - 15:39)
В php это на самом деле особого смысла не имеет. Что подтвердил пруфом killer8080


Я не говорил что не имеет смысла, пример Винстона как раз демонстрирует, что смысл есть. Я к тому что ссылку нужно использовать в объявлении функции, а не при вызове, собственно об этом и говорит мануал. Более того, если выключена директива allow_call_time_pass_reference, то получим ошибку
Цитата
Deprecated: Call-time pass-by-reference has been deprecated; ...

Собственно в 5.4 эту опцию из конфига выкинули

http://ua2.php.net/manual/ru/ini.core.php#...-pass-reference
Цитата
allow_call_time_pass_reference boolean

Нужно ли выводить предупреждение, если аргументы передаются по ссылке при вызове функции. Рекомендуется указывать в объявлении функции передаваемые по ссылке аргументы. Попробуйте выключить эту опцию и убедиться, что ваши скрипты правильно работают без нее и что они будут работать с будущими версиями языка (вы будете получать предупреждение каждый раз, когда вы будете пользоваться этой возможностью).

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

См. также Подробное описание ссылок.

Список изменений для allow_call_time_pass_referenceВерсия Описание
5.4.0  Удалена из PHP.
5.3.0  Генерирует ошибку уровня E_DEPRECATED.
5.0.0  Устарела и генерирует ошибку уровня E_COMPILE_WARNING

Спустя 4 часа, 43 минуты, 47 секунд (27.07.2012 - 00:31) neadekvat написал(а):
Цитата (killer8080 @ 26.07.2012 - 20:47)
Я не говорил что не имеет смысла, пример Винстона как раз демонстрирует, что смысл есть.

То есть, по-твоему, вот это:
func($var);

лучше, чем вот это:
$var = func($var);

?

Спустя 11 часов, 36 минут, 41 секунда (27.07.2012 - 12:07) killer8080 написал(а):
Цитата (neadekvat @ 27.07.2012 - 00:31)
То есть, по-твоему, вот это:
func($var);

лучше, чем вот это:
$var = func($var);

?


Если единственное назначение функции - модифицировать саму переменную, передаваемую аргументом, то однозначно да, особенно когда переменная содержит большой объем данных. Это не только сокращает запись
func($var);
против
$var = func($var);
но и экономит память, т.к. не требуется плодить клона переменной, в локальной области видимости. Не веришь? Проверяй
ini_set('memory_limit', '128M'); 


echo 'Initial memory: '.memory_get_usage().' bytes<br />';
$arr = range(1, 1000000);
$mem = memory_get_usage();
filter_ref($arr);
echo 'Memory usage with reference: '.(memory_get_usage() - $mem).' bytes<br />';
unset($arr);

//---------------------------------------------------------------

echo 'Initial memory: '.memory_get_usage().' bytes<br />';
$arr = range(1, 1000000);
$mem = memory_get_usage();
$arr = filter_noref($arr);
echo 'Memory usage without reference: '.(memory_get_usage() - $mem).' bytes<br />';
unset($arr);

//---------------------------------------------------------------

function filter_ref(&$arr){
$c = count($arr);
for($i = 0; $i < $c; $i++){
$arr[$i] = 1;
}
}


function filter_noref($arr){
$c = count($arr);
for($i = 0; $i < $c; $i++){
$arr[$i] = 1;
}
return $arr;
}

Спустя 3 часа, 1 минута, 3 секунды (27.07.2012 - 15:08) neadekvat написал(а):
killer8080, ты, наверное, не поверишь, но я знаю, когда создается копия переменной в памяти, а когда нет.
Но запись получается неочевидной. Передал куда-то переменную, и что? Может, ты забыл присвоить значение переменной?

Меня раздражает эта тема в php - какие-то функции возвращают значение, какие-то (меньшинство) принимают по ссылке. Про порядок аргументов я уже молчу.
Это все очень замедляет и чтение и написание кода. Тем более, когда речь идет не о стандартных функциях, которые обычно никто нафиг не комментирует - иди, типа, ищи, смотри, вставил я там амперсанд или тупо забыл присвоить значение.

А что касается памяти - это справедливо было, скажем, для Си и в больших программах.
В php, если приходится передавать большой объем данных в функцию - это уже исключительная ситуация.
Я говорю про общий случай.


_____________
Задача на корректную обработку данных (мое решение)
http://eu.battle.net/sc2/ru/profile/2212951/1/IIIIIIIIIIII/
Быстрый ответ:

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