function my_funct(){Пишет "два", все счастливы.
return array('раз','два','три');
}
$tmp = my_funct();
echo $tmp[1];
function my_funct(){Ругается на меня нехорошими словами.
return array('раз','два','три');
}
echo my_funct()[1];
Спустя 2 минуты, 56 секунд (18.03.2010 - 01:56) FatCat написал(а):
Вопрос на самом деле не праздный. Когда текст не "два", а пару мегабайт текста, $tmp = my_funct(); отжирает преизрядно лишней памяти...
Абыдна!
Абыдна!
Спустя 28 минут, 44 секунды (18.03.2010 - 02:25) qpayct написал(а):
Цитата (FatCat @ 18.03.2010 - 00:53) |
function my_funct(){Ругается на меня нехорошими словами. |
это что нострадамус предсказал 7-ой PHP ??
может всётки так?
function my_funct($i){
$arr = array('раз','два','три');
return $arr[$i];
}
echo my_funct(1);
Спустя 1 час, 32 минуты, 38 секунд (18.03.2010 - 03:58) kirik написал(а):
next можно использовать:
если конечно нужен 1-й элемент Или current() если 0-й.
function my_funct(){
return array('раз','два','три');
}
echo next(my_funct());
если конечно нужен 1-й элемент Или current() если 0-й.
Спустя 5 часов, 26 минут, 45 секунд (18.03.2010 - 09:24) sergeiss написал(а):
А ежели использовать ссылку для возврата данных? Бери там, что хошь... И лишнего не будет (не должно) пересылаться.
function my_funct( &$retval){
$retval=array('раз','два','три');
}
$tmp=array();
my_funct( $tmp );
echo $tmp[1];
Спустя 4 часа, 18 минут, 41 секунда (18.03.2010 - 13:43) FatCat написал(а):
Цитата (sergeiss @ 18.03.2010 - 10:24) |
my_funct( $tmp ); |
То же удвоение затрат памяти.
Избежать лишних затрат ресурсов не сложно, например так:
function my_funct($i=-1){
$result = array('раз','два','три');
if($i<0)return $result;
else return $result[$i];
}
echo my_funct(1); // "два"
$full_array = my_funct(); // Забираем весь массив для дальнейшей работы.
Удивила нелогичность языка: какая разница, записан массив в именованную ячейку памяти или в неименованную, массив-то машине известен, а возможность получения элемента массива из неименованной ячейки памяти не предусмотрена.
Спустя 22 минуты, 53 секунды (18.03.2010 - 14:06) glock18 написал(а):
это ведь обычная ошибка парсинга. тут дело не в нелогичности, а в том, что парсер не может эту ситуацию распознать.
Спустя 2 минуты, 1 секунда (18.03.2010 - 14:08) glock18 написал(а):
к тому же, в подобной ситуации вся громоздкая память будет выделена еще внутри функции. при присвоении результата переменной будет на эту область памяти поставлена еще одна внутренняя ссылка. то есть по идее, выделения памяти не должно произойти...
Спустя 6 минут, 2 секунды (18.03.2010 - 14:14) twin написал(а):
Смутно где то припоминается, что в 6-й версии это как то хотят разрулить.
Искать некогда источник...
Искать некогда источник...
Спустя 5 минут, 23 секунды (18.03.2010 - 14:19) sergeiss написал(а):
Цитата (FatCat @ 18.03.2010 - 14:43) |
То же удвоение затрат памяти. |
Нет!!! Потому что мы сначала объявляем массив, делаем пустой объект. Потом передаем ССЫЛКУ НА НЕГО в функцию, и функция работает с начальным объектом, а не с его копией.
Собственно говоря, для того ссылка и была придумана...
Из хэлпа:
Цитата |
Передача по ссылке Вы можете передавать переменные в функцию по ссылке, и функция сможет изменять свои аргументы. Синтаксис таков: <?php function foo(&$var) { $var++; } $a=5; foo($a); // $a здесь равно 6 ?> Заметьте, что в вызове функции отсутствует знак ссылки - он есть только в определении функции. Этого достаточно для корректной передачи аргументов по ссылке. По ссылке можно передавать: Переменные, например foo($a) Оператор new, например foo(new foobar()) Ссылки, возвращаемые функцией, например: <?php function &bar() { $a = 5; return $a; } foo(bar()); ?> |
Есть еще и "возвращение по ссылке". Это, наверное, ближе к тому, что ты хочешь получить в данном случае.
Из хэлпа:
Цитата |
Возвращение по ссылке Возвращение по ссылке используется в тех случаях, когда вы хотите использовать функцию для выбора переменной, с которой должна быть связана данная ссылка. При возвращении по ссылке используйте такой синтаксис: <?php function &find_var($param) { /* ... код ... */ return $found_var; } $foo =& find_var($bar); $foo->x = 2; ?> В этом примере устанавливается свойство объекта, возвращённого функцией find_var, а не его копии, как было бы без использования ссылок. Замечание: В отличие от передачи параметров по ссылке, & здесь нужно использовать в обоих местах - для указания на то, что вы возвращаете ссылку, а не копию, как обычно, и для указания того, что происходит связывание по ссылке, а не обычное присвоение. Замечание: Если вы возвращаете ссылку из функции используя следующий синтаксис: return ($this->value);, это не будет работать, так как вы возвращаете по ссылке результат выражения, а не переменную. По ссылке можно возвращать только переменные, ничего больше. Начиная с PHP 4.4.0 и PHP 5.1.0, если код пытается вернуть по ссылке динамическое выражение или результат оператора new, будет выброжено предупреждение E_NOTICE. |
Цитата (FatCat @ 18.03.2010 - 14:43) |
Удивила нелогичность языка: какая разница, записан массив в именованную ячейку памяти или в неименованную, массив-то машине известен, а возможность получения элемента массива из неименованной ячейки памяти не предусмотрена. |
Очень даже логично Ведь массив в ПХП - это никак не "неименованная ячейка памяти", а объект. Это в Си достаточно вернуть указатель на массив (адрес массива в памяти), и дальше можно будет обратиться к любому элементу массива. А в ПХП надо работать с элементами массива только через объект. Потому что положение элементов в памяти вовсе не обязательно является каким-то четким.
_____________
Бесплатному сыру в дырки не заглядывают...