- 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);
// ...
количество секунд в секунде — это определённо что-то новое.
bormand 16.09.2013 05:59 # +4
wvxvw 16.09.2013 10:29 # 0
bormand 16.09.2013 10:39 # +1
Небольшой фикс: в 1000. С остальным полностью согласен.
wvxvw 16.09.2013 10:41 # 0
А, ну да, все, теперь понял
bormand 16.09.2013 10:45 # 0
Ну тогда вместо 60 было бы 1/60.0 ;)
Vladiator 16.09.2013 12:02 # 0
DBdev 16.09.2013 15:03 # 0
kegdan 16.09.2013 16:00 # −6
Vladiator 16.09.2013 16:43 # 0
anonimb84a2f6fd141 16.09.2013 17:58 # 0
Vladiator 16.09.2013 17:59 # 0
anonimb84a2f6fd141 16.09.2013 19:40 # +1
Vladiator 16.09.2013 19:47 # 0
1024-- 16.09.2013 19:58 # +1
anonimb84a2f6fd141 16.09.2013 20:35 # 0
defecate-plusplus 16.09.2013 20:07 # 0
IDEA - это иде не только для жабы
Vladiator 16.09.2013 20:14 # 0
Обсуждаем Pointless arithmetic expression - ну да, это не статический анализ.
defecate-plusplus 16.09.2013 20:20 # 0
в идее всё хорошо будет и с динамическими языками, которые она умеет - и php, и js, с 1*100 без проблем разберётся
Vladiator 16.09.2013 20:30 # 0
kegdan 16.09.2013 20:54 # 0
defecate-plusplus 16.09.2013 21:03 # 0
всё в идее, на отлично
при этом, несмотря на поддержку и db, как инструмент идея заметно проигрывает даже oracle sql developer (хотя почему даже, sqldeveloper - хороший инструмент)
anonimb84a2f6fd141 16.09.2013 20:36 # 0
Ты начал сравнивать динамических пых с жавкой.
Vladiator 17.09.2013 00:26 # 0
anonimb84a2f6fd141 17.09.2013 02:06 # 0
> то она своими "Simplify" тебя рано или поздно заставит
Начал.
Vladiator 17.09.2013 02:07 # 0
anonimb84a2f6fd141 17.09.2013 03:53 # 0
wvxvw 16.09.2013 16:49 # 0
Но это нормально, еще лет десять и ПХП дойдет до уровня простеньких яызков середины прошлого века.
roman-kashitsyn 16.09.2013 19:17 # +2
P.S. В принципе, генерацию html, js и sql похапешным скриптом формально можно считать метапрограммированием...
wvxvw 16.09.2013 19:20 # 0
bormand 16.09.2013 20:03 # +1
Да никакой это не метапрограмминг, а банальнейшая константа. Причем только скалярная (инт, флоат, строка, бул, налл).
Не надо путать пыходефайн с дефайнами в других языках :)
wvxvw 16.09.2013 20:11 # 0
bormand 16.09.2013 20:14 # +3
В пхп, имхо, метапрограмминг проявляется только в reflection, в eval, и в обращении к переменным по имени аля $$x.
wvxvw 16.09.2013 20:17 # +1
bormand 16.09.2013 20:19 # +1
P.S. Ну мне лень открывать исходники, и смотреть чего делает дефайн.
wvxvw 16.09.2013 20:25 # 0
- константа, это элемент программы, в свою очередь представленная с помощью элементов языка. const в ПХП так именно себя и ведет. Т.е. он создает объект языка, доступный через интроспекцию, его можно положить в неймспейс, как и другие элементы языка, он синтаксически соответствует нашему представлению о том, что такое константа.
Почему define не константа?
- Так же как и в Си, это инструметн за пределами языка, что-то, что позволяет внести новую конструкцию в язык (но только очень ограниченно). Инструмент тупо скопированый из Си, и по традиции из Си, где нет констант в принципе, но дефайны называют константами, продолжил эту традицию.
bormand 16.09.2013 20:31 # +1
Ну какую конструкцию он туда вносит то? Этот define даже на парсер совершенно не влияет... Эти "константы" - любой идентификатор без доллара. Интерпретатор их хоть с дефайном, хоть без дефайна одинаково парсит. Небольшая разница будет только в рантайме, в зависимости от того, определили эту константу или нет: Нигде, кроме выражений, эти константы юзать нельзя. Здесь метапрограмминга не больше чем в жабьем public static final const.
> Инструмент тупо скопированый из Си, и по традиции из Си, где нет констант в принципе, но дефайны называют константами
Вот только не надо это сравнивать с сишкой. В сишке #define это действительно слабый инструмент метапрограмминга.
wvxvw 16.09.2013 20:36 # 0
Самым показательным моментом в этом смысле является то, что что бы не объявлялось через дефайн нельзя положить в неймспейс, потому что это не объект языка.
bormand 16.09.2013 20:38 # +1
Объясните это интерпретатору пыхи, который в контексте выражений любое неизвестное ему слово считает именем константы.
> мы включили какую-то неведомую херню из-за пределов языка
Вне выражений эти define НЕ РАБОТАЮТ:[code=php]
define('TEST', 'foo');
function TEST { } // Здесь объявили TEST, не foo
$x = TEST(); // Здесь вызвали TEST, не foo
$y = TEST; // и только здесь TEST раскрылся в 'foo'
bormand 16.09.2013 20:41 # +1
Ну в пыхе и переменную нельзя положить в неймспейс. Это теперь не объект языка?
bormand 16.09.2013 20:47 # 0
А вот и фиг, все ложится. Правда через жопу (что, впрочем, характерно для пыховских неймспейсов):
wvxvw 16.09.2013 21:12 # 0
bormand 16.09.2013 20:36 # +1
Ну пожалуйста, define тоже доступен.
> его можно положить в неймспейс, как и другие элементы языка
В пыхе, к сожалению, далекооо не все можно положить в неймспейс ;) Вроде как только классы и функции.
wvxvw 16.09.2013 20:46 # 0
constant - просто еще один пример заблуждения. Возможно даже умышленного заблуждения, чтобы не нагружать бедных ПХПпистов, им и так от всех этих маразмов не просто.
Что такое элемент языка? - это сущность из его системы описаная в терминах этого языка. Дефайн, напротив, это просто строка символов, которую убогий препроцессор умеет заменять на сериализрованое представление скалярного значения. Сериализированого таким образом, что оно может быть интерпретировано средствами языка.
bormand 16.09.2013 20:58 # +1
И почему же это "убогий пыховский препроцессор" подставляет ее только в выражения? Странно, не правда ли? :)
И как же это "убогий препроцессор" умудряется в рантайме подставлять значения? :) > constant - просто еще один пример заблуждения
И в чем заблуждение? В том, что есть пул констант, в котором рантайм их ищет в тот момент, когда они ему нужны (и высрав ворнинг, возвращает имя константы, если он ее там не нашел)?
wvxvw 16.09.2013 21:10 # 0
Потому что в других местах граматика не позволяет.
Еще раз, это никакой не пул констант. Это просто строки, которые потом чем-то заменяют.
bormand 16.09.2013 21:39 # 0
Угу. На этапе компиляции в p-code. Опкодом получения константы из пула ;)
Ну т.е. грубо говоря, TEST экивалентно constant('TEST'), с точностью до ворнинга и дефолтного значения.
bormand 16.09.2013 21:27 # +1
1) Когда компилятор видит неведомое слово в контексте выражений, он вкомпиливает опкод ZEND_FETCH_CONSTANT.
2) define() вызывает функцию рантайма zend_register_constant(), которая тупо (ну там не совсем тупо, но не суть) добавляет ее в хешмап zend_constants.
3) Рантайм выполняя опкод ZEND_FETCH_CONSTANT, вызывает zend_quick_get_constant() чтобы получить ее значение из zend_constants.
Ну и где здесь метапрограмминг? Весь код скомпилен в p-code задолго до исполнения тех самых define'ов.
bormand 16.09.2013 21:55 # +3
anonimb84a2f6fd141 16.09.2013 20:37 # +1
kegdan 16.09.2013 20:57 # 0
1024-- 16.09.2013 12:20 # +3
sizeof(char) в C был явно раньше
roman-kashitsyn 16.09.2013 15:07 # 0