Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Перегнать константы в массив.
Покинул форум
Сообщений всего: 310
Дата рег-ции: Дек. 2010
Помог: 0 раз(а)
Всем привет.
Создал тему тут, так как сам что-то не могу сделать.
В общем есть много файлов, которые содержат кучи констант. В некоторых файлах названия констант повторяются. Эти файлы подключаются отдельно, по этому конфликтов нет.
Мне нужно все константы перегнать в массив по такому примеру
Т.е. название файла является частью ключа, чтобы избежать повторений.
Но. В константах не только текст. Но много и html тегов и всяких кавычек и т.д...!
Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012
Помог: 7 раз(а)
Зачем Вам предопределять константы? Не проще их сразу загонять в переменную?
EuGen
Отправлено: 17 Июня, 2013 - 15:23:50
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Нативно никак. Суть в том, что для того, чтобы узнать, какие константы определяются в файле, его нужно подключить, а после подключения константы определятся. Таким образом, последующие файлы уже не смогут определить свои константы.
Если это действительно нужно, то можно воспользоваться runkit. Код с его использованием будет примерно такой:
- но это не рекомендуется, так как, во-первых, архитектурно некорректно, а во-вторых, ставит приложение в зависимость от PECL-расширения (у меня, к примеру, оно не смогло быть установлено из-за зависимостей, поэтому код выше - теоретический).
Ещё один способ - разбирать код регулярным выражением (искать define-конструкции), но это тоже плохой путь, поскольку гораздо корректнее выстроить логику так, чтобы константы использовались только по требованию и там, где действительно нужно, а изменяемые данные были либо в БД, либо в переменных (например, брались из конфига).
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
dropoff
Отправлено: 17 Июня, 2013 - 15:23:55
Посетитель
Покинул форум
Сообщений всего: 310
Дата рег-ции: Дек. 2010
Помог: 0 раз(а)
не понял на счет переменных. зачем это нужно?
в массив для того, что с ним удобно работать и переопределять когда нужно по ключам значения. + добавлять\удалять из массива что нужно... (Добавление) EuGen, суть в том, чтобы убрать вообще кучи файлов и кучи констант и работать с одним массивом.
Т.е. вместо кучи файлов с константами создать один с массивом.
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
dropoff пишет:
суть в том, чтобы убрать вообще кучи файлов и кучи констант и работать с одним массивом.
вы рефакторите код что-ли?
напишите простой скрипт-утилитку, который ообойдет все фаши файлы, регулярками распарит код определения констант и запишет все это в виде массива в отдельный файл. Потом удалите ненужные файлы, и оставьте новый, сгенеренный (Вариант сделать все это вручную, видимо, не рассматривается )
Покинул форум
Сообщений всего: 310
Дата рег-ции: Дек. 2010
Помог: 0 раз(а)
dubasua. У меня при открытии определенной страницы инклудится файл это страницы с константами. Там собраны настройки для нее. Это в любом случае не удобно и дописывать до этот системы еще какую-то считаю не правильным. Почему и хочу просто в массив все забить.
EuGen, смысл не в том, чтобы частично решить это все, а в том, чтобы полностью изменить эту систему с кучи файлов и констант на один массив.
Можно конечно массив получить через get_defined_constants(), но блин там не разобрать будет, так как константы юзерские все равно в одной куче.
DelphinPRO, по сути да, "рефакторю")). Вручную конечно такой объем обрабатывать не вариант))) Там сотни строк в десятках файлов...
Попробуйте сейчас что-то сделать с get_defined_constants().
Сейчас в голову пришло - прочитать директорию с файлами, пройтись по массиву с файлами и получить на каждый массив с get_defined_constants и все собрать в массив.
может что и получится)) (Добавление)
DelphinPRO пишет:
ПС бэкап не забудьте сделать
Ага)) Спасибо!
DelphinPRO
Отправлено: 17 Июня, 2013 - 16:05:35
Активный участник
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
вы не сможете поочереди подключать файлы, в которых определены одинаковые константы. Вам выше уже сказали.
Получаете массив с файлами (scandir, glob)
По очереди читаете файлы и парсите определения констант
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Я бы не стал полагаться на регулярные выражения - потому как eval и прочие ухищрения таким способом не обработать. Более универсально - действительно использовать include, но в отдельном процессе. Например,
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
dropoff
Отправлено: 17 Июня, 2013 - 17:43:58
Посетитель
Покинул форум
Сообщений всего: 310
Дата рег-ции: Дек. 2010
Помог: 0 раз(а)
EuGen, у меня создается только result.php с содержимым $rgConstants=array(); и все.
EuGen
Отправлено: 17 Июня, 2013 - 17:52:31
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
dropoff
Нужно, чтобы путь к файлам $sSearchPath был корректно указан. Если у Вас Windows, то путь к интерпретатору (команда php -r в коде) нужно указывать полностью, так как обычно он не присутствует в PATH-переменной. Кроме того, в Windows из system нужно убрать окончание > /dev/null &
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
dropoff
Отправлено: 17 Июня, 2013 - 18:16:27
Посетитель
Покинул форум
Сообщений всего: 310
Дата рег-ции: Дек. 2010
Помог: 0 раз(а)
У меня винда. установлен openserver
Путь $sSearchPath указываю полностью. вместо слешей ставлю как у вас DIRECTORY_SEPARATOR. Проверял, выдает полностью пусть от корня
> /dev/null & убрал. Результата нет.
Прошу прощения. В виндовс унжно заменять php -r на путь или добавлять?
EuGen
Отправлено: 17 Июня, 2013 - 18:26:34
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Полный путь к интерпретатору, ключ -r оставить. Наподобие C:\path\to\executable\php -r Если в пути встречаются пробелы, то заменить DOS-представлением как вариант (C:\Program Files будет C:\Progra~1)
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.