За последние 24 часа нас посетили 22289 программистов и 1072 робота. Сейчас ищут 622 программиста ...

Псевдонимы в foreach

Тема в разделе "PHP для новичков", создана пользователем Andarilz, 17 ноя 2019.

  1. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    В этом и кроется главная проблема. 60% из этих 90%, ты может и знаешь, остальные 30% ты думаешь, что знаешь.
    Отсюда и пробелы в изучении.
    А ещё скажу прямо, мне не нравятся люди, которые постоянно говорят, "я так и думал" после того как получат ответ. Пиши свои мысли до того как задать вопрос и тебе ответят правильно ты думаешь или нет, и если неправильно, скажут как надо думать правильно.
     
  2. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.236
    Адрес:
    там-сям
    нет, это не так.

    уверен ты сбит с толку одной особенностью PHP: отложенным копированием. )))
     
  3. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.790
    Симпатии:
    649
    @artoodetoo, я выше уже про это писал. Возможно, copy-on-write стал использовать в форыче раньше, чем в присвоении в целом. Отсюда и все терки.
     
  4. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.236
    Адрес:
    там-сям
    и цикл здесь не при чём, опять. это фишка происходит при любом присвоении массива или передаче в качестве параметра.

    для того, чтобы не возникали никому не нужные тормоза и расход памяти, PHP идёт на уловку — когда ты присваиваешь массив чему-либо или передаешь его через параметр функции либо через переменную цикла, он прямо в этот момент не копируется в новую область памяти. но будет скопирован как только ты эту новую копию массива начнешь изменять.

    это правило справедливо и для переменной цикла в foreach ($array as $item).
    если в $item залетел массив, это НЕ равнозначно &$item. но массив не будет скопирован, пока ты используешь $item только для чтения. copy-on-write никак не меняет видимое поведение программы! только в 90% случаев оптимизирует скорость и расход памяти.
     
  5. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.236
    Адрес:
    там-сям
    в учебных целях, проверьте в чём разница между этими двумя случаями:
    PHP:
    1. <?php
    2.  
    3. $aa = [
    4.   ['a' => 1, 'b' => 2],
    5.   ['a' => 3, 'b' => 4],
    6. ];
    7.  
    8. foreach ($aa as $x) {
    9.   $x['a'] = 999;
    10. }
    и

    PHP:
    1. <?php
    2.  
    3. $ao = [
    4.   (object) ['a' => 1, 'b' => 2],
    5.   (object) ['a' => 3, 'b' => 4],
    6. ];
    7.  
    8. foreach ($ao as $x) {
    9.   $x->a = 999;
    10. }
    и как изменится поведение если цикл изменить на ... as &$x) {
     
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.743
    Симпатии:
    1.319
    Адрес:
    Лень
    @Valick, я хотел бы увидеть ответ от автора.
     
  7. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    Тогда читай внимательно его и мои сообщения.
     
  8. Roman __construct

    Roman __construct Активный пользователь

    С нами с:
    27 апр 2019
    Сообщения:
    1.270
    Симпатии:
    112
    Скажу так:

    - Я сколько не читал про все эти

    PHP:
    1. class VAZ extends Car
    так нихрена и не понимал, зачем вообще нужно так усложнять код

    пока не начал применять ООП в реальных проектах, где оно как раз-таки упрощало код, а не усложняло

    У меня такой опыт.