Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> О #ifdef в PHP. 
:(
    Опции темы
Elfet
Дата 3.3.2010, 22:20 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: 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» с кодом выполняющим различные действия с одними и теми же данными, то нужно закомментировать одно из этих действий для его выполнения без вырезания директив примерно следующим образом:

Код

<?php
#ifdef COPY

$chat_page = new View('copy');
$chat_page->SetVars(array('copyright' => $this->Copyright()));
$this->html = $chat_page->Get();
$this->Display();

/*#else

$this->html = View('no_copy')::Call();
$this->Display();

*/#endif
?>



Скачать программу можно здесь: http://phpifdef.googlecode.com/files/Php%2...20Collector.exe
Исходники программы тут: http://code.google.com/p/phpifdef/

P.S.
Выложил свою первую статью на хабре: #ifdef в PHP.
Там она набрала много отрицательных и всего несколько положительных голосов.  smile 



--------------------
PM MAIL WWW Skype   Вверх
nerezus
Дата 4.3.2010, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 12
Всего: 43



А чем не покатит if? o_O


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
Elfet
Дата 4.3.2010, 01:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Тем что мне нужно собирать различные версии исходников с различным кодом. 


--------------------
PM MAIL WWW Skype   Вверх
bars80080
Дата 4.3.2010, 02:06 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Цитата(Elfet @  3.3.2010,  21:20 Найти цитируемый пост)
Там она набрала много отрицательных и всего несколько положительных голосов. 

как странно, да?


хотя какая может быть реакция, если это очередной eval?
PM MAIL WWW   Вверх
perloid
Дата 4.3.2010, 03:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 14.11.2008

Репутация: -1
Всего: -1



раньше использовал стандартный препроцессор от c++ не помню как называется,  
и еще более продвинутый m4
но это все костыли, которые больше мешают и создают лишние проблемы.

а то что на C# написано так это большой минус, т.к. изза мелкой утилиты зависисость от большого рантайма.
PM MAIL   Вверх
nerezus
Дата 4.3.2010, 03:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 12
Всего: 43



Цитата

Тем что мне нужно собирать различные версии исходников с различным кодом. 
 
Вы наверное не поняли. Повторю свой вопрос: чем if не угодил?


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
awers
Дата 4.3.2010, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: 21
Всего: 31



Что то мне задача совершенно непонятна. Может лучше юзать svn/git и соответственно tags/branches?
PM MAIL WWW ICQ Skype   Вверх
skyboy
Дата 4.3.2010, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Elfet, интересная идея - простой препроцессор.
действительно, в отличие от if / else эти конструкции вполне могут находиться в любом месте кода, например, внутри определения класса:
Код

class test {
#ifdef PHP5
public static function test() {
}
#else
function test() {
}
#endif
}

куда if не впихнешь. 
в принципе, я вижу одно применение: слияние РНР4 и РНР5-версий кода в один файл.
все остальные применения, которые приходят мне в голову(переключение используемых механизмов, изменение поведения в зависимости от некоторых внешних по отношению к системе параметров) проигрывают в ясности и расширяемости использованию фабрик и/или файлов конфигураций. 
да и include/require c динамически формируемыми именами("toolkit.php4.php"/"toolkit.php5.php") позволяет сделать то же. 
даже если класс/функция должна иметь разный интерфейс(наборы методов у класса, параметров функции) в зависимости от определенных условий(что уж попахивает ошибкой проектирования) - require решает.
а у препроцессинга как средства определения поведения кода есть крупный недостаток: нечитабельность. тем более, что отладка будет производиться на уже обработанной препроцессором частной версией кода, а писать код надо в "полной" версии. и получается - пишем в одном месте, отлаживаем в другом. не говоря уже о том, что подобные конструкции как абсолютно не типичные для языка, в любом редакторе предстанут обычными комментариями, что ничуть не упростит написание кода.
PM MAIL   Вверх
nerezus
Дата 4.3.2010, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 12
Всего: 43



Цитата

в принципе, я вижу одно применение: слияние РНР4 и РНР5-версий кода в один файл.
 Ну это было актуально лет 5 назад все же, сейчас пхп4 не поддерживается.
Так что имхо бесполезная вещь-костыль для не фанатов проектирования.


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
Elfet
Дата 4.3.2010, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



skyboy, я вначале использовал разные файлы и подключал разные классы унаследованные от одного интерфейса. 

Директивы #ifdef я не предлагаю как панацея от всего, всего лишь ещё один способ сделать проще что-то.

Добавлено через 3 минуты и 13 секунд
А использую я это в своём проекте чата, так как я делаю две версии бесплатную и платную. Можно конечно было бы использовать ветку в svn, как предложил 
awers, но мне пока больше нравится мой вариант. 


--------------------
PM MAIL WWW Skype   Вверх
IZ@TOP
Дата 4.3.2010, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



А для чего это нужно? Можно хотя бы одну живую рабочую версию?

Добавлено через 3 минуты и 10 секунд
Цитата(Elfet @  4.3.2010,  15:36 Найти цитируемый пост)
А использую я это в своём проекте чата, так как я делаю две версии бесплатную и платную. Можно конечно было бы использовать ветку в svn, как предложил 
awers, но мне пока больше нравится мой вариант.  

Все равно стырят. А для того, что бы сделать платную и бесплатную, не обязательно добавлять такой изврат, достаточно изучить несколько паттернов и делать сборки для разных версий, совместно с svn это было бы еще проще.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Elfet
Дата 4.3.2010, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Цитата(IZ@TOP @  4.3.2010,  16:13 Найти цитируемый пост)
А для чего это нужно? Можно хотя бы одну живую рабочую версию?

Я в своём чате это использую. 


Цитата(IZ@TOP @  4.3.2010,  16:13 Найти цитируемый пост)
достаточно изучить несколько паттернов и делать сборки для разных версий, совместно с svn это было бы еще проще. 

Иногда нужно заменить всего несколько строк в коде и прикручивать какие-то паттерны смысла нету, тут я и использую #ifdef

В С++ очень широко используются эти препроцессоры, так почему бы их и в php не использовать? 

P.S. Паттерны это конечно же хорошо, но как-то последнее время их предлагают использовать практически для всего, как и ООП, что не всегда является наилучшим вариантом.  



--------------------
PM MAIL WWW Skype   Вверх
IZ@TOP
Дата 5.3.2010, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



Цитата(Elfet @  5.3.2010,  00:36 Найти цитируемый пост)
В С++ очень широко используются эти препроцессоры, так почему бы их и в php не использовать? 

C++ язык высокого уровня, которые применяется для решения задач в разных областях. PHP же, язык скриптовый, специализированный под веб, где существуют стандартные решения для коммерции. Я уже не говорю о том, что ты себе этим прекомпилируемым PHP кучу проблем доставишь при отладке.

Цитата(Elfet @  5.3.2010,  00:36 Найти цитируемый пост)
P.S. Паттерны это конечно же хорошо, но как-то последнее время их предлагают использовать практически для всего, как и ООП, что не всегда является наилучшим вариантом.  

А почему не использовать, если для решения большинства задач уже есть готовые схемы? Изобретаем велосипеды, а потом их постоянно переделываем.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Elfet
Дата 5.3.2010, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Цитата(IZ@TOP @  5.3.2010,  12:04 Найти цитируемый пост)
А почему не использовать, если для решения большинства задач уже есть готовые схемы? Изобретаем велосипеды, а потом их постоянно переделываем. 

Да, для решения части задач можно использовать и паттерны. Но это не всегда лучший вариант. 


--------------------
PM MAIL WWW Skype   Вверх
MoLeX
Дата 5.3.2010, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



Цитата(Elfet @  4.3.2010,  14:36 Найти цитируемый пост)
но мне пока больше нравится мой вариант.  

свой велосипед всегда ближе к телу, даже не смотря на то что он кривой.



Elfet, а смысл этим хвастаться показывать на форуме? Для 99,9% это ненужная утилита... 


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0618 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.