Что за штука - мне непонятная: private function getContent(&$article, $context) { ......... } &$article - Это передача в функцию Объекта ? Переменной иль чего ?
принимает аргумент по ссылке (если отдадут). Т.е. то, что ты этой переменной сделаешь, то и снаружи функции произойдёт. Так делают либо для того, чтобы что-то наковырять во вне функции, или для экономии, чтобы не копировать большие объёмы данных при передаче в функцию.
Как ты должен наверное знать, когда ты передаешь в функцию какую-нибудь переменную, то внутри функции делается ее копия и работа происходит с копией, т.е. если ты сделаешь так: Код (PHP): function EditVal($var) { $var = 20; } $a = 10; EditVal($a); echo $a; // $a будет равно 10, потому что 20 было присвоено копии а если ты перед переменной пишешь &, то копия переменной не делается, а работа происходит с тем, что прислали и в итоге: Код (PHP): function EditVal(&$var) { $var = 20; } $a = 10; EditVal($a); echo $a; // $a будет равно 20
стек это конечно хорошо, но сомневаюсь что сейчас для понимания ему поможет эта информация, скорее на оборот, по этому все на примитивном уровне, пускай знает что делается, а как это по научному называется и какие именно процессы происходят это не важно, а если ему станет важно, будет читать документацию по РНР, ну или как вы говорите - курить.
$a = 2; $b =& $a; $b++; echo $a; // почему 3 ??? я же функцию не вызывал!!!!111!!1!1!!!111!! поэтому я и прошу называть вещи своими именами СРАЗУ. если хочешь объяснить - объясни СРАЗУ нормально.
Ты же знаешь Ну как не вызвал, разве ++ это не функция? на сколько мне известно из С++ это функция. Ну а вообще по хорошему мне надо было написать и этот пример, это я упустил.
а у тебя есть счетчик сидений в луже?)))) ты по ссылке в него значения передаешь?))))) ладно тебе, не грузись сильно. ну реально, если хочешь рассказать, то расскажи правильно. твоими словами конечно работает, но на самом деле оно не так работает как ты описываешь. не важно, новичку или не новичку ты описываешь. надо всегда говорить правду а не выдумывать. вот.
Никто не написал что & - указатель. Я напишу: символ & в пхп указывает что передаваться будет pointer на переменную (by ref), а не ее значение (by val). Например у вас чудовищное массивное дерево и вы хотите обработать только одну ветку. Если вы ее передадите как значение - будет скопировано все что висит на этом элементе массива, а если как указатель - то скопируется только адрес элемента. Второй практический случай - это ссылки на переменные из рекурсий и кложей (closure). Чтобы не копировать значение с хобота в ж-у рекурсивной функции - применяйте указатель. А чтобы рекурсивно работала безымянная функция - кложа - ей нужна ссылка на переменную которой она предназначена. Все остальное - баяны. PHP не язык, а скрипт - там все и так предусмотрено для оптимизации копирования значений.
Еще из практики. Допустим появился массив из бд или еще откуда и он - исходник, по нему делается рендер допустим и больше он не нужен Код (PHP): $arr= $link->query($q); // типа из бд foreach($arr as &$values) // был длинномерный элемент массива, стал одномерный $values='<p>'.$values['foo'].'</p><span>'.$values['bar'].'</span>'; return join('',$arr); Добавлено спустя 3 минуты 23 секунды: НБ. Именно для таких мероприятий предусмотрена функция array_reduce()
foreach($arr as &$values) чаще используется, когда нужно что-то поменять в значениях массива, так кода гораздо меньше. По ссылке foreach быстрее работает, кто-нибудь замерял?
логика "по ссылке" в принципе быстрее работает так как не нужно тратить такты процессора на инициализацию новой ячейки памяти и создания указателя на неё. тупо объявляется указатель на уже существующую ячейку. ну то есть допустим есть фильм, занимает 1.47 гб. и созадется на него символическая ссылка. от этого два файла не стали весить 2.94гб и самое главное не пришлось ждать пока произойдет перечитка из одного файла в другой. просто одной области на диске соответствует два разных имени.