[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Нелогичненько...
FatCat
function my_funct(){
return array('раз','два','три');
}
$tmp = my_funct();
echo $tmp[1];
Пишет "два", все счастливы.


function my_funct(){
return array('раз','два','три');
}
echo my_funct()[1];
Ругается на меня нехорошими словами.

blink.gif unsure.gif



Спустя 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(){
return array('раз','два','три');
}
echo my_funct()[1];
Ругается на меня нехорошими словами.

blink.gif  unsure.gif

это что нострадамус предсказал 7-ой PHP ?? ohmy.gif

может всётки так?
function my_funct($i){
$arr = array('раз','два','три');
return $arr[$i];
}
echo my_funct(1);

Спустя 1 час, 32 минуты, 38 секунд (18.03.2010 - 03:58) kirik написал(а):
next можно использовать:
function my_funct(){
return array('раз','два','три');
}
echo next(my_funct());

если конечно нужен 1-й элемент smile.gif Или 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 );

То же удвоение затрат памяти. sad.gif


Избежать лишних затрат ресурсов не сложно, например так:
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)
Удивила нелогичность языка: какая разница, записан массив в именованную ячейку памяти или в неименованную, массив-то машине известен, а возможность получения элемента массива из неименованной ячейки памяти не предусмотрена.

Очень даже логично smile.gif Ведь массив в ПХП - это никак не "неименованная ячейка памяти", а объект. Это в Си достаточно вернуть указатель на массив (адрес массива в памяти), и дальше можно будет обратиться к любому элементу массива. А в ПХП надо работать с элементами массива только через объект. Потому что положение элементов в памяти вовсе не обязательно является каким-то четким.


_____________
Бесплатному сыру в дырки не заглядывают...
Быстрый ответ:

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