PHP: парсинг и замена "short_open_tag"

версия для печати

Речь о тегах в php-скриптах. Согласно мануала при включенной опции разрешается короткая форма записи <? ?> тегов PHP. Если такая запись запрещена, то препроцессор PHP парсит только <?=...?>, что на самом деле не относится к коротким php-тегам, а является сокращенной записью инструкции <?php echo ...?>

Суть моей проблемы: перешел на новую версию PHP, при этом ставил его не из официальных репов, а в полуручном режиме из PPA. В новом конфиге опция short_open_tag оказалась отключена, у меня упало несколько сайтов и я подзаколебался искать причину. Учитывая, как я обновил PHP, мест для возможных багов стало более, чем достаточно.

В итоге-то я разобрался, но что меня больше всего расстраивает: PHP никак не ругается на короткий тег в шаблоне, если он запрещен настройкой. Шаблон в целом парсится, при этом могут возникнуть ошибки, которые PHP уже видит, но найти их истиную причину сложно. Еще хуже, если ошибок не возникает, а просто исчезает часть страницы, зато появляется php-код в чистом виде. Вообще красота..

Для решения траблы есть два выхода: включить опцию или исправить шаблоны и не использовать короткие теги. Я сделал консольный скрипт для правки, скачать можно на Гитхабе.

Скрипт ищет в указанном каталоге и подкаталогах файлы с заданным расширением, анализирует каждый из них на использование коротких тегов и выводит в консоль результат. Если указано юзером, заменяет короткие теги на полное представление.

Примеры использования:

// Найти короткие теги в htm-файлах в заданном каталоге и подкаталогах

short_tags_replace.php /path/to/views/

// Найти короткие теги в php-файлах

short_tags_replace.php /path/to/views/ php

// Найти короткие теги в htm-файлах и заменить из на полное представление

short_tags_replace.php /path/to/views/ htm replace

Автоконтроль

Для того, чтобы в дальнейшем уменьшить вероятность попадания на баг с короткими тегами, можно в хуках Гита запилить проверку, например, в pre-commit. Вот моя реализация:

#!/bin/sh

echo "Запуск гит-хука 'pre-commit'\n\n"

# Проверка на отстутствие коротких php-тегов в шаблонах проекта
validators_dir='/some/path/'
errors=$(
    $validators_dir/short_tags_replace.php /path/to/views/ &
    $validators_dir/short_tags_replace.php /another/path/to/views/
)

if [ ! -z "$errors" ]; then
    echo "Не прошла проверка на отстутствие коротких php-тегов в шаблонах проекта. Лог:\n"
    echo "$errors"
    exit 1
fi
У меня в проекте два каталога, подлежащие проверке, поэтому два вызова скрипта.

Не забудьте разрешить выполнение для pre-commit и short_tags_replace.php. Если Гит их не сможет запустить, то никаких ошибок не будет, а коммит без проблем уйдет в реп. В этом плане Гит такой же тихушник, как и PHP с тегами.

[1oo%, EoF]

Понравилась статья? Расскажите о ней друзьям:

Метки: PHP, кодинг


Комментарии
Для работы модуля комментариев включите javaScript


Показать/скрыть правила
Имя
[i] [b] [u] [s] [url]
:-) ;-) :D *lol* 8-) :-* :-| :-( *cry* :o :-? *unsure* *oops* :-x *shocked* *zzz* :P *evil*

Осталось 1000 символов.
Код защиты от спама Обновить код
Каждый комментарий проходит ручную модерацию. 100% фильтрация спама.
Продвижение
Время
Метки