За последние 24 часа нас посетили 17048 программистов и 1835 роботов. Сейчас ищут 1624 программиста ...

Что за переменные с символами: &$

Тема в разделе "PHP для новичков", создана пользователем антигерой, 28 янв 2015.

  1. антигерой

    антигерой Активный пользователь

    С нами с:
    22 фев 2009
    Сообщения:
    9
    Симпатии:
    0
    Адрес:
    RU, Севастополь
    Что за штука - мне непонятная:

    private function getContent(&$article, $context)
    { ......... }

    &$article - Это передача в функцию Объекта ? Переменной иль чего ?
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    принимает аргумент по ссылке (если отдадут). Т.е. то, что ты этой переменной сделаешь, то и снаружи функции произойдёт. Так делают либо для того, чтобы что-то наковырять во вне функции, или для экономии, чтобы не копировать большие объёмы данных при передаче в функцию.
     
  3. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Как ты должен наверное знать, когда ты передаешь в функцию какую-нибудь переменную, то внутри функции делается ее копия и работа происходит с копией, т.е. если ты сделаешь так:
    Код (PHP):
    1. function EditVal($var)
    2. {
    3.     $var = 20;
    4. }
    5.  
    6. $a = 10;
    7. EditVal($a);
    8. echo $a; // $a будет равно 10, потому что 20 было присвоено копии  
    а если ты перед переменной пишешь &, то копия переменной не делается, а работа происходит с тем, что прислали и в итоге:
    Код (PHP):
    1. function EditVal(&$var)
    2. {
    3.     $var = 20;
    4. }
    5.  
    6. $a = 10;
    7. EditVal($a);
    8. echo $a; // $a будет равно 20 
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    VLK, стек функции вызова всегда копируется. разница не в этом. внимательнее.
     
  5. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    стек это конечно хорошо, но сомневаюсь что сейчас для понимания ему поможет эта информация, скорее на оборот, по этому все на примитивном уровне, пускай знает что делается, а как это по научному называется и какие именно процессы происходят это не важно, а если ему станет важно, будет читать документацию по РНР, ну или как вы говорите - курить.
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    $a = 2;
    $b =& $a;
    $b++;

    echo $a; // почему 3 ??? я же функцию не вызывал!!!!111!!1!1!!!111!!

    поэтому я и прошу называть вещи своими именами СРАЗУ. если хочешь объяснить - объясни СРАЗУ нормально.
     
  7. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Ты же знаешь :)

    Ну как не вызвал, разве ++ это не функция? на сколько мне известно из С++ это функция.

    Ну а вообще по хорошему мне надо было написать и этот пример, это я упустил.
     
  8. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    оператор
     
  9. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    это унарный оператор. иди КУРИ мануал))) даже в сях это унарный оператор.
     
  10. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    получается я опять сел в лужу?
     
  11. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а у тебя есть счетчик сидений в луже?)))) ты по ссылке в него значения передаешь?)))))
    ладно тебе, не грузись сильно. ну реально, если хочешь рассказать, то расскажи правильно. твоими словами конечно работает, но на самом деле оно не так работает как ты описываешь. не важно, новичку или не новичку ты описываешь. надо всегда говорить правду а не выдумывать. вот.
     
  12. deblogger

    deblogger Новичок

    С нами с:
    11 июл 2013
    Сообщения:
    200
    Симпатии:
    0
    Никто не написал что & - указатель. Я напишу: символ & в пхп указывает что передаваться будет pointer на переменную (by ref), а не ее значение (by val).

    Например у вас чудовищное массивное дерево и вы хотите обработать только одну ветку. Если вы ее передадите как значение - будет скопировано все что висит на этом элементе массива, а если как указатель - то скопируется только адрес элемента.

    Второй практический случай - это ссылки на переменные из рекурсий и кложей (closure). Чтобы не копировать значение с хобота в ж-у рекурсивной функции - применяйте указатель. А чтобы рекурсивно работала безымянная функция - кложа - ей нужна ссылка на переменную которой она предназначена.

    Все остальное - баяны. PHP не язык, а скрипт - там все и так предусмотрено для оптимизации копирования значений.
     
  13. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
  14. deblogger

    deblogger Новичок

    С нами с:
    11 июл 2013
    Сообщения:
    200
    Симпатии:
    0
    Еще из практики. Допустим появился массив из бд или еще откуда и он - исходник, по нему делается рендер допустим и больше он не нужен

    Код (PHP):
    1. $arr= $link->query($q); // типа из бд
    2. foreach($arr as &$values)
    3.    // был длинномерный элемент массива, стал одномерный
    4.    $values='<p>'.$values['foo'].'</p><span>'.$values['bar'].'</span>'; 
    5. return join('',$arr);
    6.  
    Добавлено спустя 3 минуты 23 секунды:
    НБ. Именно для таких мероприятий предусмотрена функция array_reduce()
     
  15. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    что-то это какой-то за уши притянутый пример
     
  16. Period

    Period Новичок

    С нами с:
    29 дек 2014
    Сообщения:
    148
    Симпатии:
    1
    foreach($arr as &$values) чаще используется, когда нужно что-то поменять в значениях массива, так кода гораздо меньше.

    По ссылке foreach быстрее работает, кто-нибудь замерял?
     
  17. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    логика "по ссылке" в принципе быстрее работает так как не нужно тратить такты процессора на инициализацию новой ячейки памяти и создания указателя на неё. тупо объявляется указатель на уже существующую ячейку. ну то есть допустим есть фильм, занимает 1.47 гб. и созадется на него символическая ссылка. от этого два файла не стали весить 2.94гб и самое главное не пришлось ждать пока произойдет перечитка из одного файла в другой. просто одной области на диске соответствует два разных имени.
     
  18. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    чем не по ссылке? в пхп ленивая копия.