За последние 24 часа нас посетили 6582 программиста и 523 робота. Сейчас ищут 135 программистов ...

Разница между $a=$b и $a=&$b

Тема в разделе "PHP для новичков", создана пользователем troelsenon, 12 мар 2018.

  1. troelsenon

    troelsenon Новичок

    С нами с:
    13 ноя 2015
    Сообщения:
    14
    Симпатии:
    2
    Доброго времени суток!
    Подскажите в чем разница между $a = $b и $a =& $b ?
     
  2. [vs]

    [vs] Суперстар

    С нами с:
    27 сен 2007
    Сообщения:
    10.156
    Симпатии:
    517
    В первом варианта, значение $a становится таким же, как $b. Во втором варианте, $a становится ссылкой на $b. То есть если меняется значение $b, будет меняться значение $a.
     
    troelsenon нравится это.
  3. troelsenon

    troelsenon Новичок

    С нами с:
    13 ноя 2015
    Сообщения:
    14
    Симпатии:
    2
    Значит в
    $a = 10;
    $b = $a;
    таком варианте будет занято больше памяти т.к. будет занято две ячейки значением 10.
    А, тут
    $a = 10;
    $b =& $a;
    Память будет занято меньше, т.к. в ней будет только одно значение 10.
    Я правильно понял?
     
  4. [vs]

    [vs] Суперстар

    С нами с:
    27 сен 2007
    Сообщения:
    10.156
    Симпатии:
    517
    @troelsenon да, но нет. PHP умный и он на самом деле не будет копировать данные в новую ячейку, пока это реально не потребуется.
     
  5. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.565
    Симпатии:
    565
    В целом, да, но если копнуть глубже - не совсем, а на самом деле скорее нет, чем да )

    Для начала, простой код:

    PHP:
    1. <?php
    2. $start = memory_get_usage(true);
    3. $a = str_repeat('0', 1024);
    4. echo (memory_get_usage(true) - $start).PHP_EOL; // 1280
    5. $b = $a;
    6. echo (memory_get_usage(true) - $start).PHP_EOL; // 1312
    7. $c = &$a;
    8. echo (memory_get_usage(true) - $start).PHP_EOL; // 1336
    9. $a = str_repeat('1', 1024);
    10. echo (memory_get_usage(true) - $start).PHP_EOL; // 2616
    11. $b = str_repeat('1', 1024);
    12. echo (memory_get_usage(true) - $start).PHP_EOL; // 2616
    Так вот, если не вдаваться в детали вы всё поняли верно, но как видно из примера, присвоение $b = $a и $c = &$a увеличило память практически одинаково, потому что в обоих случаях PHP создал ссылку на $a с той лишь разницей, что в первом случае она носит чисто технический характер и разорвется как только $a или $b изменятся: $a = str_repeat('1', 1024) и $b = str_repeat('1', 1024); дают нам прирост в килобайт.

    Но на самом деле, при старте PHP сразу забирает 2Mb под процесс и потому реальная память будет так же забираться кусками лишь по превышении этого лимита.

    PHP:
    1. echo memory_get_usage(true).PHP_EOL; // 2097152
    2. $a = str_repeat('0', 1024 * 1024); // + 1 Mb
    3. echo memory_get_usage(true).PHP_EOL; // 2097152
    4. $b = str_repeat('0', 1024 * 1024); // + 1 Mb
    5. echo memory_get_usage(true).PHP_EOL; // 4194304
    6. $c = str_repeat('0', 1024 * 1024); // + 1 Mb
    7. echo memory_get_usage(true).PHP_EOL; // 6291456
    8. $d = str_repeat('0', 1024 * 1024); // + 1 Mb
    9. echo memory_get_usage(true).PHP_EOL; // 8388608
    Вообще, если вам интересно как это всё происходит внутри, можете начать с этого:
    https://habrahabr.ru/company/mailru/blog/275497/
    https://habrahabr.ru/company/mailru/blog/308240/
    https://webshake.ru/post/659

    в блоге mailru на хабре довольно неплохо все это расписано, поищите там статьи по теме.
    --- Добавлено ---
    p.s. ну и что бы не начать ненароком холивар, замечу, что речь шла про php7 и "ссылка" относилась к zval.
     
    troelsenon нравится это.
  6. troelsenon

    troelsenon Новичок

    С нами с:
    13 ноя 2015
    Сообщения:
    14
    Симпатии:
    2
    Спасибо за разъяснения!
     
  7. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    1.095
    Симпатии:
    233
    Адрес:
    Татарстан
    если не про память а по смыслу - то вот такой пример даст понять
    PHP:
    1. $a = 10;
    2. $b =&$a;
    3. echo "a=$a, b=$b";// выдаст a=10, b=10
    4. $a = 12;
    5. echo "a=$a, b=$b";// выдаст a=12, b=12