![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
В своем проекте мне понадобилось собирать различные версии исходников. Причём так что бы в различных сборках помещались различные куски кода. if-else мне здесь не подходил, потому что нужно было что бы код либо точно входил, либо не входил в сборку.
Решение Поэтому я решил использовать директивы #ifdef/#endif. Для их реализации я создал небольшую программку на C#, которая обрабатывает эти директивы. В программе нужно указать исходный файл или папку, и папку куда нужно помещать готовый результат. На наличие директив обрабатываются только php файлы, остальные просто копируются. PHP Ifdef Collector PrintScreen Работа программы Программа имеет глобальный массив defines, который создаётся из третьего поля («Defines (comma separated)»). Этот массив может быть дополнен директивой «#define TEXT» в php коде. Программа умеет обрабатывать следующие директивы: «#ifdef TEXT», «#ifndef TEXT». Первая включает код если директива определена, вторая включает если не определена. Эти директивы обязательно должны иметь закрывающие «#endif». Так же программа умеет обрабатывать «#else» и вложенность этих директив. Заключение Поскольку в php символ «#» определяет комментарий, то код может быть выполнен и без вырезания этих директив. Однако, если использовать «#ifdef — #else — #endif» с кодом выполняющим различные действия с одними и теми же данными, то нужно закомментировать одно из этих действий для его выполнения без вырезания директив примерно следующим образом:
Скачать программу можно здесь: http://phpifdef.googlecode.com/files/Php%2...20Collector.exe Исходники программы тут: http://code.google.com/p/phpifdef/ P.S. Выложил свою первую статью на хабре: #ifdef в PHP. Там она набрала много отрицательных и всего несколько положительных голосов. |
|||
|
||||
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 12 Всего: 43 |
А чем не покатит if? o_O
|
|||
|
||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Тем что мне нужно собирать различные версии исходников с различным кодом.
|
|||
|
||||
| bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 71 Всего: 315 |
||||
|
||||
| perloid |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 14.11.2008 Репутация: -1 Всего: -1 |
раньше использовал стандартный препроцессор от c++ не помню как называется,
и еще более продвинутый m4 но это все костыли, которые больше мешают и создают лишние проблемы. а то что на C# написано так это большой минус, т.к. изза мелкой утилиты зависисость от большого рантайма. |
|||
|
||||
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 12 Всего: 43 |
Вы наверное не поняли. Повторю свой вопрос: чем if не угодил? |
|||
|
||||
| awers |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1465 Регистрация: 22.3.2006 Где: Россия, Таганрог Репутация: 21 Всего: 31 |
Что то мне задача совершенно непонятна. Может лучше юзать svn/git и соответственно tags/branches?
|
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 75 Всего: 260 |
Elfet, интересная идея - простой препроцессор.
действительно, в отличие от if / else эти конструкции вполне могут находиться в любом месте кода, например, внутри определения класса:
куда if не впихнешь. в принципе, я вижу одно применение: слияние РНР4 и РНР5-версий кода в один файл. все остальные применения, которые приходят мне в голову(переключение используемых механизмов, изменение поведения в зависимости от некоторых внешних по отношению к системе параметров) проигрывают в ясности и расширяемости использованию фабрик и/или файлов конфигураций. да и include/require c динамически формируемыми именами("toolkit.php4.php"/"toolkit.php5.php") позволяет сделать то же. даже если класс/функция должна иметь разный интерфейс(наборы методов у класса, параметров функции) в зависимости от определенных условий(что уж попахивает ошибкой проектирования) - require решает. а у препроцессинга как средства определения поведения кода есть крупный недостаток: нечитабельность. тем более, что отладка будет производиться на уже обработанной препроцессором частной версией кода, а писать код надо в "полной" версии. и получается - пишем в одном месте, отлаживаем в другом. не говоря уже о том, что подобные конструкции как абсолютно не типичные для языка, в любом редакторе предстанут обычными комментариями, что ничуть не упростит написание кода. |
|||
|
||||
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 12 Всего: 43 |
Так что имхо бесполезная вещь-костыль для не фанатов проектирования. |
|||
|
||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
skyboy, я вначале использовал разные файлы и подключал разные классы унаследованные от одного интерфейса.
Директивы #ifdef я не предлагаю как панацея от всего, всего лишь ещё один способ сделать проще что-то. Добавлено через 3 минуты и 13 секунд А использую я это в своём проекте чата, так как я делаю две версии бесплатную и платную. Можно конечно было бы использовать ветку в svn, как предложил awers, но мне пока больше нравится мой вариант. |
|||
|
||||
| IZ@TOP |
|
|||
![]() Панда-бир! ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4795 Регистрация: 3.2.2003 Где: Бамбуковый лес Репутация: 44 Всего: 73 |
А для чего это нужно? Можно хотя бы одну живую рабочую версию?
Добавлено через 3 минуты и 10 секунд Все равно стырят. А для того, что бы сделать платную и бесплатную, не обязательно добавлять такой изврат, достаточно изучить несколько паттернов и делать сборки для разных версий, совместно с svn это было бы еще проще. -------------------- Один из розовых плюшевых-всадников апокалипсиса... очень злой... Семь кругов ада для новых элементов языка Мои разрозненные мысли |
|||
|
||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Я в своём чате это использую.
Иногда нужно заменить всего несколько строк в коде и прикручивать какие-то паттерны смысла нету, тут я и использую #ifdef В С++ очень широко используются эти препроцессоры, так почему бы их и в php не использовать? P.S. Паттерны это конечно же хорошо, но как-то последнее время их предлагают использовать практически для всего, как и ООП, что не всегда является наилучшим вариантом. |
|||
|
||||
| IZ@TOP |
|
||||
![]() Панда-бир! ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4795 Регистрация: 3.2.2003 Где: Бамбуковый лес Репутация: 44 Всего: 73 |
C++ язык высокого уровня, которые применяется для решения задач в разных областях. PHP же, язык скриптовый, специализированный под веб, где существуют стандартные решения для коммерции. Я уже не говорю о том, что ты себе этим прекомпилируемым PHP кучу проблем доставишь при отладке.
А почему не использовать, если для решения большинства задач уже есть готовые схемы? Изобретаем велосипеды, а потом их постоянно переделываем. -------------------- Один из розовых плюшевых-всадников апокалипсиса... очень злой... Семь кругов ада для новых элементов языка Мои разрозненные мысли |
||||
|
|||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
||||
|
||||
| MoLeX |
|
|||
![]() Местный пингвин ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4076 Регистрация: 17.5.2007 Репутация: 46 Всего: 140 |
свой велосипед всегда ближе к телу, даже не смотря на то что он кривой. Elfet, а смысл этим хвастаться показывать на форуме? Для 99,9% это ненужная утилита... -------------------- Amazing |
|||
|
||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |