Function / by reference. Использование памяти.

Name

Новичок
Function / by reference. Использование памяти.

Правильно ли я понимаю
если переменная в функции не объявлена global
то после выполнения функции она нигде не сохраняеться
и память соотвественно не использует.

Следующие две функции одинаковы с точки зрения использования памяти?


PHP:
function &get() {
	$a = array('big_array');
	return $a;
}

$b = &get();


function get() {
	$a = array('big_array');
	return $a;
}

$b = get();
 

Screjet

Новичок
да. Объясняю:
в первом случае возвращаешь указатель на big_array, массив не освобождается, т.к. есть указатели на него.
Во втором случае копию big_array. И т.к. $a не объявлен как static,
то по завершению ф-ции, $a освобождается.
 

Name

Новичок
Ну да.
А я что то думал что делая как во втором варианте
я экономлю память.

Просто в свое время эксперементировал:

PHP:
function &get() {
    global $a;

    $a = array('big_array');
    return $a;
} 

$b = &get();
$b = 15;

echo "<pre>"; print_r($a); echo "</pre>";
echo "<pre>"; print_r($b); echo "</pre>";
В этом случае by reference имеет смысл
 

Screjet

Новичок
Не только в этом. Если array действительно big_array (более 10-50к), то reference еще и добавляет производительности, т.к. создать ссылку для пхп-машины куда быстрее, чем скопировать большой массив.

Далее: как правильно работать с такими тяжеловесами:

Правила:
1) Тяжеловес вообще не должен никуда перемещаться.
2) Нужно думать так, чтобы и копировать его не приходилось.

Пример:
PHP:
// создаем "тяжеловес". Где - неважно, как - неважно.
$huge_array = file("my_huge_file.db");
// Далее можно использовать ф-ции для массивов, где массив передается по ссылке,
// типа array_walk, shuffle, etc.. (см. ман). Или собственные:
function my_filter( &$a ){
  unset($a[0],$a[5],$a[15]);
}
// т.е. так же как и для стандартных, передаем аргументом ссылку на массив.
my_filter($huge_array);
Пример примитивный, но для думающих людей достаточен.
Удачи!
 

Сергей123

Новичок
Кстати, у меня в голове откуда-то инфа, что вместо
function my_filter( &$a ){
если массив $a в функции не будет меняться можно писать
function my_filter( $a ){
т.к. копирование будет лишь при изменении массива.

Это так?
 

.des.

Поставил пиво кому надо ;-)
Да это так. В php применяется принцип copy-on-write
 
Сверху