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

0

  1. 1
  2. 2
  3. 3
  4. 4
define('SECOND', 1);
define('MINUTE', SECOND*60);
define('HOUR', MINUTE*60);
// ...

количество секунд в секунде — это определённо что-то новое.

Запостил: fidelcomandante fidelcomandante, (Updated )

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

  • Вполне здравая мысль. Если даты будут приходить в миллисекундах, то нужно будет передефайнить SECONDS в 0.001, а другой код менять не нужно будет. Вероятность получить даты в миллисекундах совсем не нулевая, учитывая то, что в ж.скрипте они таки в миллисекундах.
    Ответить
    • > SECONDS в 0.001
      Небольшой фикс: в 1000. С остальным полностью согласен.
      Ответить
      • Ну это если делить, я думал автор умножать собирался.

        А, ну да, все, теперь понял
        Ответить
        • > я думал автор умножать собирался
          Ну тогда вместо 60 было бы 1/60.0 😉
          Ответить
  • IntelliJ IDEA плюсанула бы тут такой код — если умножаешь на константу, равную 1, или прибавляешь нулевую, то она своими "Simplify" тебя рано или поздно заставит избавиться от красивого кода.
    Ответить
    • А её обмануть и сказать, что это "10 - 9" (или еще как-то закрутить) не проканает?
      Ответить
      • Статический анализатор это без проблем в единицу переведёт.
        Ответить
            • Ты вообще понимаешь, что качество статического анализа определяется в первую очередь языком и в языках со строгой статической типизацией работает априори лучше, чем в динамических?
              Ответить
                  • Капитаним?
                    Обсуждаем Pointless arithmetic expression - ну да, это не статический анализ.
                    Ответить
                    • ты просто начал за здравие, а закончил жабой
                      в идее всё хорошо будет и с динамическими языками, которые она умеет - и php, и js, с 1*100 без проблем разберётся
                      Ответить
                      • Я нигде не говорил, что оно плохо справляется с другими языками.
                        Ответить
                    • на работе сейчас и жабьи проекты, и js SPA
                      всё в идее, на отлично
                      при этом, несмотря на поддержку и db, как инструмент идея заметно проигрывает даже oracle sql developer (хотя почему даже, sqldeveloper - хороший инструмент)
                      Ответить
                • >IntelliJ IDEA плюсанула бы тут такой код
                  Ты начал сравнивать динамических пых с жавкой.
                  Ответить
                  • Не начал. Чел возмущается, что одна секунда в секунде - неужели он бы не возмущался на точно такую же коллекцию psfi?
                    Ответить
                    • >IntelliJ IDEA плюсанула бы тут такой код — если умножаешь на константу, равную 1, или прибавляешь нулевую, то она своими "Simplify" тебя рано или поздно заставит избавиться от красивого кода.
                      > то она своими "Simplify" тебя рано или поздно заставит
                      Начал.
                      Ответить
    • Просто в ПХП очень мало практики метапрограммирования, и люди боятся / не понимают инструметны, которые им должны в этом помагать. В языках, в которых это случается чаще есть специальные конструкции на случай, например, раскрытия макросов в бесполезный код, или подстановки таких констант, при которых выражения либо становятся бессмысленными, либо могут быть сокращены.
      Но это нормально, еще лет десять и ПХП дойдет до уровня простеньких яызков середины прошлого века.
      Ответить
      • Вы хотите видеть философствующих метапрограммирующих похапешников? я нет.

        P.S. В принципе, генерацию html, js и sql похапешным скриптом формально можно считать метапрограммированием...
        Ответить
        • define - это уже метапрограммирование, так что это свершившийся факт, а не прихоти какого-то wvxvw.
          Ответить
          • > это уже метапрограммирование
            Да никакой это не метапрограмминг, а банальнейшая константа. Причем только скалярная (инт, флоат, строка, бул, налл).

            Не надо путать пыходефайн с дефайнами в других языках 🙂
            Ответить
            • Нет, в ПХП, кстати, есть настоящие константы. Дефайны - это очень примитвный инструмент метапрограммирования. Точно так же как в Си.
              Ответить
              • Ну блин, я зря что-ли ман ман прочел перед тем как это писать? 🙂 Константа это банальная, а не сишный дефайн: http://php.net/manual/en/function.define.php. Эдак вы и жабий public static final int x = 42 запишете в инструменты метапрограмминга...

                В пхп, имхо, метапрограмминг проявляется только в reflection, в eval, и в обращении к переменным по имени аля $$x.
                Ответить
                • Та ну, ПХП документация написана ПХП программистами. Они сами не понимают, чего делают, смысла им доверять нету.
                  Ответить
                  • Мудрейший и всемогущий wvxvw, попирающий пятами небеса, знает тайны пыха, неведомые даже его создателю 😉

                    P.S. Ну мне лень открывать исходники, и смотреть чего делает дефайн.
                    Ответить
                    • В чем заключается разница?
                      - константа, это элемент программы, в свою очередь представленная с помощью элементов языка. const в ПХП так именно себя и ведет. Т.е. он создает объект языка, доступный через интроспекцию, его можно положить в неймспейс, как и другие элементы языка, он синтаксически соответствует нашему представлению о том, что такое константа.
                      Почему define не константа?
                      - Так же как и в Си, это инструметн за пределами языка, что-то, что позволяет внести новую конструкцию в язык (но только очень ограниченно). Инструмент тупо скопированый из Си, и по традиции из Си, где нет констант в принципе, но дефайны называют константами, продолжил эту традицию.
                      Ответить
                      • > внести новую конструкцию в язык
                        Ну какую конструкцию он туда вносит то? Этот define даже на парсер совершенно не влияет... Эти "константы" - любой идентификатор без доллара. Интерпретатор их хоть с дефайном, хоть без дефайна одинаково парсит. Небольшая разница будет только в рантайме, в зависимости от того, определили эту константу или нет:
                        echo TEST;
                        // Use of undefined constant TEST - assumed 'TEST'
                        // Выводит TEST
                        
                        define('TEST', 42);
                        echo TEST;
                        // Выводит 42
                        Нигде, кроме выражений, эти константы юзать нельзя. Здесь метапрограмминга не больше чем в жабьем public static final const.

                        > Инструмент тупо скопированый из Си, и по традиции из Си, где нет констант в принципе, но дефайны называют константами
                        Вот только не надо это сравнивать с сишкой. В сишке #define это действительно слабый инструмент метапрограмминга.
                        Ответить
                        • В ПХП нет ключевого слова TEST, все, что не начинается с доллара, должно быть ключевым словом, либо вызовом функции. Что мы сделали в этом случае - мы включили какую-то неведомую херню из-за пределов языка.

                          Самым показательным моментом в этом смысле является то, что что бы не объявлялось через дефайн нельзя положить в неймспейс, потому что это не объект языка.
                          Ответить
                          • > все, что не начинается с доллара, должно быть ключевым словом, либо вызовом функции
                            Объясните это интерпретатору пыхи, который в контексте выражений любое неизвестное ему слово считает именем константы.

                            > мы включили какую-то неведомую херню из-за пределов языка
                            Вне выражений эти define НЕ РАБОТАЮТ:[code=php]
                            define('TEST', 'foo');
                            function TEST { } // Здесь объявили TEST, не foo
                            $x = TEST(); // Здесь вызвали TEST, не foo
                            $y = TEST; // и только здесь TEST раскрылся в 'foo'
                            Ответить
                          • > что бы не объявлялось через дефайн нельзя положить в неймспейс, потому что это не объект языка
                            Ну в пыхе и переменную нельзя положить в неймспейс. Это теперь не объект языка?
                            Ответить
                          • > что бы не объявлялось через дефайн нельзя положить в неймспейс
                            А вот и фиг, все ложится. Правда через жопу (что, впрочем, характерно для пыховских неймспейсов):
                            namespace foo {
                                define('TEST', 'global');
                                define('foo\TEST', 42);
                                define('bar\TEST', 100500);
                                print TEST; // выведет 42. Нельзя положить в неймспейс? :)
                            }
                            Ответить
                            • Хз. раньше нельзя так было. У меня ПХП не установлен, и устанавливать не хочется чтобы проверить. Неужто их еще и приватными / публичными можно объявить? А локально внутри функции?
                              Ответить
                      • > Т.е. он создает объект языка, доступный через интроспекцию
                        Ну пожалуйста, define тоже доступен.
                        define('TEST', 'foo');
                        echo constant('TEST');

                        > его можно положить в неймспейс, как и другие элементы языка
                        В пыхе, к сожалению, далекооо не все можно положить в неймспейс 😉 Вроде как только классы и функции.
                        Ответить
                        • Нет, это побочный эффект, но он свидетельствует о том, чем на самом деле, и с точки зрения языка это является.
                          constant - просто еще один пример заблуждения. Возможно даже умышленного заблуждения, чтобы не нагружать бедных ПХПпистов, им и так от всех этих маразмов не просто.
                          Что такое элемент языка? - это сущность из его системы описаная в терминах этого языка. Дефайн, напротив, это просто строка символов, которую убогий препроцессор умеет заменять на сериализрованое представление скалярного значения. Сериализированого таким образом, что оно может быть интерпретировано средствами языка.
                          Ответить
                          • > убогий препроцессор умеет заменять на сериализрованое представление скалярного значения
                            И почему же это "убогий пыховский препроцессор" подставляет ее только в выражения? Странно, не правда ли? 🙂

                            И как же это "убогий препроцессор" умудряется в рантайме подставлять значения? 🙂
                            function test() {
                                echo TEST0 . "\n" . TEST1 . "\n" . TEST2 . "\n";
                            }
                            
                            for ($i=0; $i<3; $i++) {
                                define('TEST' . $i, "foo" . $i);
                            }
                            test();
                            > constant - просто еще один пример заблуждения
                            И в чем заблуждение? В том, что есть пул констант, в котором рантайм их ищет в тот момент, когда они ему нужны (и высрав ворнинг, возвращает имя константы, если он ее там не нашел)?
                            Ответить
                            • > И почему же это "убогий пыховский препроцессор" подставляет ее только в выражения?
                              Потому что в других местах граматика не позволяет.

                              Еще раз, это никакой не пул констант. Это просто строки, которые потом чем-то заменяют.
                              Ответить
                              • > Это просто строки, которые потом чем-то заменяют.
                                Угу. На этапе компиляции в p-code. Опкодом получения константы из пула 😉

                                Ну т.е. грубо говоря, TEST экивалентно constant('TEST'), с точностью до ворнинга и дефолтного значения.
                                Ответить
                      • Почитал исходники. Ничего интересного.

                        1) Когда компилятор видит неведомое слово в контексте выражений, он вкомпиливает опкод ZEND_FETCH_CONSTANT.
                        2) define() вызывает функцию рантайма zend_register_constant(), которая тупо (ну там не совсем тупо, но не суть) добавляет ее в хешмап zend_constants.
                        3) Рантайм выполняя опкод ZEND_FETCH_CONSTANT, вызывает zend_quick_get_constant() чтобы получить ее значение из zend_constants.

                        Ну и где здесь метапрограмминг? Весь код скомпилен в p-code задолго до исполнения тех самых define'ов.
                        Ответить
                        • P.S. Сейчас придет wvxvw, и скажет, что "ПХП интерпретатор написан ПХП программистами. Они сами не понимают, чего делают, смысла им доверять нету". И его гипотетическая концепция пыхо-define'ов, позаимствованных их сишки, навсегда останется единственно верной 😉
                          Ответить
                    • Ну я тоже слышал, что документации пыха доверять нельзя, надо самому читать исходники.
                      Ответить
  • > количество секунд в секунде — это определённо что-то новое
    sizeof(char) в C был явно раньше
    Ответить

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

Где здесь C++, guest?!

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


    8