- 1
- 2
- 3
- 4
define('SECOND', 1);
define('MINUTE', SECOND*60);
define('HOUR', MINUTE*60);
// ...
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+140
define('SECOND', 1);
define('MINUTE', SECOND*60);
define('HOUR', MINUTE*60);
// ...
количество секунд в секунде — это определённо что-то новое.
Небольшой фикс: в 1000. С остальным полностью согласен.
А, ну да, все, теперь понял
Ну тогда вместо 60 было бы 1/60.0 ;)
IDEA - это иде не только для жабы
Обсуждаем Pointless arithmetic expression - ну да, это не статический анализ.
в идее всё хорошо будет и с динамическими языками, которые она умеет - и php, и js, с 1*100 без проблем разберётся
всё в идее, на отлично
при этом, несмотря на поддержку и db, как инструмент идея заметно проигрывает даже oracle sql developer (хотя почему даже, sqldeveloper - хороший инструмент)
Ты начал сравнивать динамических пых с жавкой.
> то она своими "Simplify" тебя рано или поздно заставит
Начал.
Но это нормально, еще лет десять и ПХП дойдет до уровня простеньких яызков середины прошлого века.
P.S. В принципе, генерацию html, js и sql похапешным скриптом формально можно считать метапрограммированием...
Да никакой это не метапрограмминг, а банальнейшая константа. Причем только скалярная (инт, флоат, строка, бул, налл).
Не надо путать пыходефайн с дефайнами в других языках :)
В пхп, имхо, метапрограмминг проявляется только в reflection, в eval, и в обращении к переменным по имени аля $$x.
P.S. Ну мне лень открывать исходники, и смотреть чего делает дефайн.
- константа, это элемент программы, в свою очередь представленная с помощью элементов языка. const в ПХП так именно себя и ведет. Т.е. он создает объект языка, доступный через интроспекцию, его можно положить в неймспейс, как и другие элементы языка, он синтаксически соответствует нашему представлению о том, что такое константа.
Почему define не константа?
- Так же как и в Си, это инструметн за пределами языка, что-то, что позволяет внести новую конструкцию в язык (но только очень ограниченно). Инструмент тупо скопированый из Си, и по традиции из Си, где нет констант в принципе, но дефайны называют константами, продолжил эту традицию.
Ну какую конструкцию он туда вносит то? Этот define даже на парсер совершенно не влияет... Эти "константы" - любой идентификатор без доллара. Интерпретатор их хоть с дефайном, хоть без дефайна одинаково парсит. Небольшая разница будет только в рантайме, в зависимости от того, определили эту константу или нет: Нигде, кроме выражений, эти константы юзать нельзя. Здесь метапрограмминга не больше чем в жабьем public static final const.
> Инструмент тупо скопированый из Си, и по традиции из Си, где нет констант в принципе, но дефайны называют константами
Вот только не надо это сравнивать с сишкой. В сишке #define это действительно слабый инструмент метапрограмминга.
Самым показательным моментом в этом смысле является то, что что бы не объявлялось через дефайн нельзя положить в неймспейс, потому что это не объект языка.
Объясните это интерпретатору пыхи, который в контексте выражений любое неизвестное ему слово считает именем константы.
> мы включили какую-то неведомую херню из-за пределов языка
Вне выражений эти define НЕ РАБОТАЮТ:[code=php]
define('TEST', 'foo');
function TEST { } // Здесь объявили TEST, не foo
$x = TEST(); // Здесь вызвали TEST, не foo
$y = TEST; // и только здесь TEST раскрылся в 'foo'
Ну в пыхе и переменную нельзя положить в неймспейс. Это теперь не объект языка?
А вот и фиг, все ложится. Правда через жопу (что, впрочем, характерно для пыховских неймспейсов):
Ну пожалуйста, define тоже доступен.
> его можно положить в неймспейс, как и другие элементы языка
В пыхе, к сожалению, далекооо не все можно положить в неймспейс ;) Вроде как только классы и функции.
constant - просто еще один пример заблуждения. Возможно даже умышленного заблуждения, чтобы не нагружать бедных ПХПпистов, им и так от всех этих маразмов не просто.
Что такое элемент языка? - это сущность из его системы описаная в терминах этого языка. Дефайн, напротив, это просто строка символов, которую убогий препроцессор умеет заменять на сериализрованое представление скалярного значения. Сериализированого таким образом, что оно может быть интерпретировано средствами языка.
И почему же это "убогий пыховский препроцессор" подставляет ее только в выражения? Странно, не правда ли? :)
И как же это "убогий препроцессор" умудряется в рантайме подставлять значения? :) > 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'ов.
sizeof(char) в C был явно раньше