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

    +159

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    class someClass {
        protected $map = array();
    
        public function __construct(Array $data)
        {
            $this->map = $this->generateMap($data);
        }
    
        protected function generateMap(Array $data)
        {
            $map = array();
            foreach ($data as $key => $value) {
                ...
                $map[$otherSomeKey] = $otherSomeValue;
                ...
            }
    
            $this->map = $map;
        }
    }

    Сидел час и не мог понять, почему у меня в $this->map оказывался постоянно NULL!
    Уже передебажил всё, что мог и извел все нервы!

    Запостил: striker, 27 Августа 2009

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

    • Красота!
      Ответить
    • показать все, что скрытосмотри приведение типов null == fals == array()

      юзай строгое сравнение ===

      удачного говнокода
      Ответить
      • лишь бы что-то ляпнуть, по теме, не по теме - пофиг.
        Ответить
    • При чем здесь строгое значение? Метод возвращать должен что-нибудь.
      Ответить
    • Вот зачем нужно периодически одёргивать программистов, сообщая, что метод ничего не возвращает. А PHP, значит, этого не делает... Запомнить надобно...
      Ответить
      • че
        Ответить
        • Развёрнутое объяснение.
          Из шестой строчки видно, что свойству, полю map присваивается результат работы функции-члена, метода generateMap, при этом мы видим: на самом деле generateMap ничего не возвращает. Это ошибка, вероятно, случайна, но грубая. Например C++ словит такую ошибку на этапе компиляции, указав, что не может положить ничего во что-то. А в PHP такой код возник, видимо, по той причине, что PHP не отловил на этапе выполнения подобную вопиющую несправедливость по отношению к честному полю map.
          Ответить
          • Ну про то, что ошибка в коде я понял... А вот про 2-ю часть да... PHP уже не тот ;D
            Ответить
          • С точки зрения php тут всё как раз очень логично. $this->map честно заполнился на этапе выполнения метода generateMap(), и тут же при присваивании затер его в ноль. Издержки отсутствия строгой типизации.
            Ответить
            • Я не спорю с тем, что это совершенно нормально для PHP. Я в такие ситуации не попадал никогда, имею привычку документировать то, что пишу.
              Другое дело, что данная ситуация абсурдна с точки зрения языка высокого уровня. Метод НЕ ВОЗВРАЩАЕТ ничего, а вовсе не ВОЗВРАЩАЕТ НИЧЕГО. И присваивание в данной ситуации абсурдно, должно было бы ловиться при трансляции.
              В паскле мы бы наблюдали даже различие организации кода: процедура или функция. Упрощение С сводящие всё к наличию return это упрощение записи.
              Если бы функция-член возвращала NULL и размещала его в поле, которое определялось бы массивом, - такая ошибка была бы следствием отсутствия строгой типизации. Данная ситуация - это уже абсурд.
              Ответить
            • P.S. Вы не подумайте, что я PHP ругаю и пытаюсь унизить (просто как-то получилось, что я словно бы другие языки в пример поставил). Если бы я его не рассматривал как язык выполняющий свою задачу, я бы и не думал о нём. Тут дело именно в том, что данный код #1699 показывает, что существуют в языке проблемные места, граничащие со здравым смыслом, что накладывает на программиста дополнительную ответственность.
              Ответить

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