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

    +163.5

    1. 1
    2. 2
    3. 3
    $this->query_insert($this, array('', $mode, '', '',$id_group_new, $id_subgroup, $id_product,
    '', '', '', '', '', '', '', '', '',
    '', '', '', '', '', '', '', '', '', '', '', ''));

    Вышел на этот кусок гкода с ошибки о неверном количестве значений в sql insert, не удивился :)

    Запостил: hardcoder, 10 Марта 2010

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

    • А зачем передавать $this?
      По-моему в этом говнокод.

      ЗЫ А значений в query_insert всего два: указатель и массив.
      Ответить
      • $this иногда приходится передавать когда используются статические методы и свойства.
        Ответить
        • Тогда это ГК в квадрате
          Ответить
        • К статическим методам применяется не ->, а ::
          Ответить
          • Правда что ли?

            Тогда поясню. Допустим есть ряд таблиц, для каждой создан свой класс. Наследования и все дела.

            Есть статическое свойство для каждой таблицы - это её имя(может быть всё что угодно и метод статический в том числе).

            У класса родителя есть метод query_insert. Текущий объект принадлежит дочернему классу. Когда дочерний объект вызовет метод родительского класса, доставшегося ему по наследству, то в этом методе (здесь query_insert) определение текущего класса (get_class) покажет не дочерний класс, а родительский. А вот get_class($this) даст доступ как раз к текущему классу.
            Ответить
            • Если текущий объект принадлежит дочернему классу, то он и так имеет к нему (самому себе) доступ.
              Ответить
              • class a
                  {
                  static public function say()
                    {
                    echo "a class\n";
                    }
                
                  public function sayWho()
                    {
                    call_user_func(array(get_class(), 'say'));
                    }
                
                  public function sayRealWho($obj)
                    {
                    call_user_func(array(get_class($obj), 'say'));
                    }
                  }
                
                class b extends a
                  {
                  static public function say()
                    {
                    echo "b class\n";
                    }
                
                  public function speak()
                    {
                    $this->sayWho();              // получим a class
                    $this->sayRealWho($this); //получим b class
                    }
                  }
                
                $b = new b();
                $b->speak();
                Ответить
                • мм, что вы хотели сказать понятно, но коду незачот (hint: возможно вы где то ошиблись, и хотели показать другой принцип ;)

                  вот тоже самое без $obj но с $this, вывод аналогичный

                  class a
                    {
                    static public function say()
                      {
                      echo "a class\n";
                      }
                  
                    public function sayWho()
                      {
                      call_user_func(array(get_class(), 'say'));
                      }
                  
                    public function sayRealWho()
                      {
                      call_user_func(array(get_class($this), 'say'));
                      }
                    }
                  
                  class b extends a
                    {
                    static public function say()
                      {
                      echo "b class\n";
                      }
                  
                    public function speak()
                      {
                      $this->sayWho();        // получим a class
                      $this->sayRealWho(); 	//получим b class
                      }
                    }
                  
                  $b = new b();
                  $b->speak();
                  Ответить
                  • Действительно, бес попутал... this передавать не надо. Спасибо.
                    Ответить
                • 1) Разберись с функцией get_class. При вызове без параметров она ВСЕГДА возвращает имя класса, где определен метод (т.е. get_class() == __CLASS__).
                  2) Статические методы вызываются с помощью self (или static в 5.3+).
                  3) Есть т.н. позднее статическое связывание (LSB), но к приведенному выше коду оно отношения не имеет.
                  Ответить
                  • 1. Ага, разобрался...

                    2. Если вызвать self в методе родительского класса когда используется дочерний объект, то получим в self родительский класс и, таким образом, вызовем статический метод родительского класса.

                    3. К моему коду как раз и имеет значение, спасибо, узнал новое... теперь можно переосмыслить один проект.
                    Ответить
                    • 2 - это как раз и есть LSB, когда self ссылается на ближайшего родителя, где определен статический метод. Лучше постараться избежать этого и не злоупотреблять статическими методами и их переопределением. Либо переходить на 5.3, где эта проблема решена.
                      Ответить
                      • Я понял, но отвечал последовательно. Поэтому такой ответ и получился...
                        Ответить
      • Совершенно верно, в этом также говнокод!
        + передавать массив пустых значений вместо хэша с нужными значениями, а если понадобиться вставить значение где-нибудь между '', '', '', '', '', '', '', '', '' и '', '', '', '', '', '', '', '', '', '', '', '' то вообще пипец, или если число полей увеличиться...

        ЗЫ: я имел в виду инструкцию sql генерируемую в query_insert из-за неверного числа элементов в массиве.
        Ответить
    • показать все, что скрытокстати у кого есть такой же диагноз: очень воротит от употребления слова "код" в отношении программ написанных на языке такого уровня, как пхп (или там джава).

      хз, код это что-то более машинное имхо (ср. "кодер" vs. "программер")) это вот пхповое обезьяничанье нифига не "код".

      жалко другого слова не успели придумать.
      Ответить
      • "код это что-то более машинное" более, чем что? Чем ничего? А, если ничего нет, то как может само по себе слово быть "более"?
        "такого уровня" - это имеется в виду Высокоуровневые языки программирования?
        Ответить
      • сложно согласиться, но самое грустное что вот так собезъянничали не какие-нибудь школьники, люди с высшим образованием, да ещё и по профильной специальности с кафедры ЭВМ, куда катиться уровень образования...
        Ответить
    • всё в этом мире можно сделать разными способами... как минимум тремя...
      Ответить

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