1. PHP / Говнокод #16666

    +154

    1. 1
    2. 2
    3. 3
    4. 4
    $a = null;
    var_dump($a, $a[0], $a); // NULL, NULL, NULL // what the fuck?
    $a[0] = null;
    var_dump($a); // array(0 => NULL)

    "PHP и type juggling", том третий. При этом на первый вызов $a[0] не ругается, будто при приведении NULL к пустому массиву в нем появляется нулевой элемент.

    Запостил: Fike, 09 Сентября 2014

    Комментарии (7) RSS

    • Забавно. На реальном массиве показывает нотис про отсутствующий индекс/оффсет, а на null'е - молчит в тряпочку.

      Во второй строке, оно, походу, ничего и не конвертит. Просто оператор [] на null'е всегда молча возвращает null.

      А вот по третьей - да, интересно. null превращается в свежий array(). Видимо для автосоздания массивов подходит и неопределенная переменная и null (если написать $x['foo'][4] = 42 - пых сам запилит все необходимые уровни).
      Ответить
      • По строке 3. Из доки на php.net:
        $arr[key] = value;
        If $arr doesn't exist yet, it will be created, so this is also an alternative way to create an array.

        Про null молчат, но, походу, он тоже прокатит. Да и отсутствующие переменные тоже читаются как null...
        Ответить
    • > Во второй строке, оно, походу, ничего и не конвертит. Просто оператор [] на null'е всегда молча возвращает null.

      Думаю, что конвертит, но не сохраняет. Array access в пхп реально существует только там, где его написали, т.е. в массивах, строках и объектах.
      Ответить
      • > в пхп
        С них станется случай с null'ом обработать отдельно.
        Ответить
        • C ним и работают отдельно. Проверяется тип zval, видят что null, дальше с ним никаких операций не идет. Никакого array access у него быть не должно.
          Ответить
      • При этом у строки все несуществующие символьные индексы преобразуются в ноль, т. е. $s['trololo'] ≡ $s[0]. Очевидный трюк, ага.
        Ответить
    • В перле такая фича называется автовивификацей, правда работает немного по-другому.

      # explicit undefs
      my $arr = undef;
      my $hash = undef;
       
      print 'Initial State: ' . Dumper({
      	arr => $arr,
      	hash => $hash,
      });
       
      print 'Non-existent Elements: ' . Dumper({
      	'arr->[0]' => $arr->[0],
      	'hash->{foo}' => $hash->{foo},
      });
       
      print 'After Vivification: ' . Dumper({
      	arr => $arr,
      	hash => $hash,
      });
      # $arr => [], $hash => {}


      http://ideone.com/feHLxm
      Ответить

    Добавить комментарий