"PHP" / Говнокод #1699 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 striker, (Updated )

Комментарии (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 показывает, что существуют в языке проблемные места, граничащие со здравым смыслом, что накладывает на программиста дополнительную ответственность.
            Ответить

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

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8