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 :: Класс шаблонизатор, интересно мнение опытных ооп-php-программистов
Покинул форум
Сообщений всего: 16
Дата рег-ции: Июль 2010 Откуда: Пермь, Россия
Помог: 0 раз(а)
Здраствуйте! Потребовался простенький класс шаблонизатор с поддержкой вложенных шаблонов, а в ООП я не силен и по разным примерам из сети вроде написал такой класс, все работает, но хотелось бы увидеть мнение и поправки от более опытных людей.
Собственно сам класс:
Еще раз напишу, что в ООП PHP я начинающий и поэтому прошу сильно не критиковать по поводу кода представленного выше, а лучше посоветовать как оптимизировать данный класс.
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
wats пишет:
А лучше посоветовать как оптимизировать данный класс.
В принципе ваш класс шаблонизатора достаточно стандартный в том числе в плане производительности - однако можно оптимизировать процесс вставки и использования вложенных шаблонов Дело в том что если вы подразумаете использовать систему со списком шаблонов которые могут быть различным образом вложены друг в друга - то можно учесть такой подшаблон который будет включаться во множество других - и например изменение некоторых его параметров отразится во всех использующих его шаблонах В вашем же случае вся иехархия вложенных шаблонов не может использовать одни и те же реальные объекты с общими настройками - поскольку для каждого подшаблона вы обязательно создаете новый экземпляр класса который является собственным значением соответствуюего свойства для родительского шаблона По этой причине имеет смысл добавить возможность подключения определенного шаблона как дочернего объкта по ссылке - причем с сохранением всей его вложенной иерархии если таковая имеется
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
wats
Отправлено: 03 Июля, 2010 - 18:53:11
Новичок
Покинул форум
Сообщений всего: 16
Дата рег-ции: Июль 2010 Откуда: Пермь, Россия
Помог: 0 раз(а)
JustUserR, спасибо, что ответили. Буду переписывать класс.
Как вы наверно поняли, подшаблоны подключаются через метод block и можете подключать их таким образом сколько угодно.
Подшаблон обрабатывается вместе с массивом данных предназначенных для него, в примере массивом данных является $data_menu:
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
wats пишет:
JustUserR, спасибо, что ответили. Буду переписывать класс
Пожалуйста! Разработанная вами новая версия класса является действительно более эффективной - а также компоненты вложенных шаблонов являются лучше разделенными и контролируемыми В качестве дополнительных улучшений можно добавить следующие - во-первых перед выполнением оператора extract имеет смысл просмотреть значения всех переменных которые соответствуют ключам хеш-массива - и выполнить их сохранение во временный массив а также после окончания выполнения PHP-кода подшаблона вернуть старые значения переменным - это позволит защититься от потенциальных ошибок при передаче в хеш-массиве $data ключей которые соответствуют реальным переменным Во-вторых можно добавить проверку на синтаксическую правильность подключаемого шаблона - например с помощью функции http://php.su/functions/?runkit-lint-file
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
wats
Отправлено: 04 Июля, 2010 - 12:10:48
Новичок
Покинул форум
Сообщений всего: 16
Дата рег-ции: Июль 2010 Откуда: Пермь, Россия
Помог: 0 раз(а)
JustUserR пишет:
Разработанная вами новая версия класса является действительно более эффективной - а также компоненты вложенных шаблонов являются лучше разделенными и контролируемыми
Спасибо большое
JustUserR пишет:
во-первых перед выполнением оператора extract имеет смысл просмотреть значения всех переменных которые соответствуют ключам хеш-массива - и выполнить их сохранение во временный массив а также после окончания выполнения PHP-кода подшаблона вернуть старые значения переменным - это позволит защититься от потенциальных ошибок при передаче в хеш-массиве $data ключей которые соответствуют реальным переменным
Здесь не совсем понял, вы имеете в виду, что возможны конфликты между внешними переменными и переменными полученными из массива $data? Если да, то такого конфликта не может быть, так как метод block работает независимо и возвращает полностью обработанный шаблон где все переменные уже заменены на их значения.
JustUserR пишет:
Во-вторых можно добавить проверку на синтаксическую правильность подключаемого шаблона
Обязательно это учту.
----- Обычный web-мастер
JustUserR
Отправлено: 05 Июля, 2010 - 01:55:07
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
wats пишет:
Спасибо большое
Пожалуйста! Всегда приятно видеть функциональную библиотеку или класс который работает эффективно и выполняет требуемую работу - и при этом не содержит ненужных функций и излишних наворотов в решении и тем более не использует больших сторонних библиотек Дело в том что несмотря на наличие большого числа фреймворков и библиотек для различных целей - написание собственного решения небольшой задачи гораздо более эффективно чем использование соответствующей функции из фреймворка
wats пишет:
Здесь не совсем понял, вы имеете в виду, что возможны конфликты между внешними переменными и переменными полученными из массива $data? Если да, то такого конфликта не может быть, так как метод block работает независимо и возвращает полностью обработанный шаблон где все переменные уже заменены на их значения.
Действительно я подразумевал такой конфликт имен из-за использования функции extract - однако после проверки вижу что данная функция экспортирует значения хеш-массива в локальную область видимости Тем не менее в общем случае в вашем коде переменная $block может быть подвержена такому перекрытию в случае если в хеш-массиве $data будет передан соответствующий ключ - но это легко решается путем добавления опции EXTR_SKIP к функции extract поскольку по умолчанию подразумевается перезапись опцией EXTR_OVERWRITE
wats пишет:
Обязательно это учту
Можете также посмотреть решение для перехвата фатальных ошибок в PHP если они возникнут к примеру в подключаемом файле - оно описано здесь http://dklab[dot]ru/lib/PHP_CodeFilter/
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
wats
Отправлено: 05 Июля, 2010 - 09:23:05
Новичок
Покинул форум
Сообщений всего: 16
Дата рег-ции: Июль 2010 Откуда: Пермь, Россия
Помог: 0 раз(а)
JustUserR пишет:
Тем не менее в общем случае в вашем коде переменная $block может быть подвержена такому перекрытию в случае если в хеш-массиве $data будет передан соответствующий ключ - но это легко решается путем добавления опции EXTR_SKIP к функции extract поскольку по умолчанию подразумевается перезапись опцией EXTR_OVERWRITE
Вы правы, поправил, заодно изменил $block на $template_block, что бы уж наверняка
Едиственное, что пока не использовал runkit_lint_file, так как у меня на локальном сервере выдает ошибку, что такая функция не найдена, наверно должно быть установлено какое то расширение.
С PHP_CodeFilter пока не знаком, обязательно попробую.
----- Обычный web-мастер
JustUserR
Отправлено: 06 Июля, 2010 - 13:34:05
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
wats пишет:
Вы правы, поправил, заодно изменил $block на $template_block, что бы уж наверняка
Так стало гораздо лучше - причем такие проверки и фильтрации экспортируемых данных нужно не только для того чтобы увеличить безопасность приложения с точки зрения внешнего воздейтсвия на него - но и исключить возможные внутренние сложнообнаружимые ошибки связанные с конфликтами имен и областей видимости
wats пишет:
Едиственное, что пока не использовал runkit_lint_file, так как у меня на локальном сервере выдает ошибку, что такая функция не найдена, наверно должно быть установлено какое то расширение
Для работы с указанной функцией требуется наличие расширения http://php.su/functions/?cat=runkit установочные файлы для которого можно скачать здесь http://pecl.php.net/package/runkit Данное расширение предоставляет набор функций по динамическому управлению исполняемым PHP-кодом - имееются возможности создания и удаления констант и функций а также переопределению их кода во время исполнения и возможности по управлению пространствами имен - в частности это огранизовать собственный интерпретатор PHP-кода например для подключаемых шаболонов причем за счет применения встроенной возможности sandbox-ирования с помощью объекта Runkit_Sandbox это делает процесс еще более эффективным - также имеется возможность эмуляции многопоточных приложений Наличие такой ширикой функциональности данного расширения требует чтобы оно интегрировалось в PHP на этапе его сборки - поэтому вам придется пересобрать PHP из исходных файлов с подключением данного расширения отдельно
wats пишет:
С PHP_CodeFilter пока не знаком, обязательно попробую.
В принципе данная библиотека обеспечивает возможности по префильтрации PHP-кода в подключаемых шаблонов - тем не менее Runkit_Sandbox обеспечивает более широкие возможности по отдельному исполнению подключаемого PHP-кода и делает это более чистым образом
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
wats
Отправлено: 07 Июля, 2010 - 20:25:57
Новичок
Покинул форум
Сообщений всего: 16
Дата рег-ции: Июль 2010 Откуда: Пермь, Россия
Помог: 0 раз(а)
Эх что то я разочаровался, так как не вижу смысла использовать такой класс, так как вместо него можно использовать просто пользовательскую функцию для вставки подшаблонов:
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
wats пишет:
Эх что то я разочаровался, так как не вижу смысла использовать такой класс, так как вместо него можно использовать просто пользовательскую функцию для вставки подшаблонов
Использование класса позволяет инкапсулировать ваши данные для шаблона и упростить дальнейшее возможное расширение его возможностей - кроме того можно огранизовать систему в которой подшаблоны будут является наследуемыми классами и использоваться соответствующим образом
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
wats
Отправлено: 19 Июля, 2010 - 09:14:22
Новичок
Покинул форум
Сообщений всего: 16
Дата рег-ции: Июль 2010 Откуда: Пермь, Россия
Помог: 0 раз(а)
JustUserR, вы как всегда правы) Я пересмотрел свое мнение на счет этого.
Сейчас начал создавать свой небольшой mvc-каркас, так сказать мини-фреймворк для будующих приложений по примеру реализации Yii framework, думаю в нем будет использоваться именно этот шаблонизатор.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.