Плохая ли реализация шаблонизации и снижет ли она производительность PHP проекта вообщем?

Мне нужен был шаблонизатор, но только простой, без всяких тяжелых Smarty и Twig (PHP сам по себе шаблонизатор).

Вообщем Контролер обратился к модулю, он отработал свое и теперь пора обертывать его в шаблон:

<?

class controller {
    static $class = false;

    static function run (){

        //  Маршрутизация

        Router::router();
        self::$class = Router::$module;

        // Шаблонизатор
        self::show();
    }

    static function show (){

        $data = array(
            'title'  => meta::$title,
            'descr'  => meta::$descr,
            'key'    => meta::$key,
            'css'    => css::style(),
            'js'     => js::getJs(),
            'header' => Header::show(),
            'buffer' => call_user_func(self::$class.'::show'),
            'footer' => Footer::show(),
            'other'  => ''
        );

        view::tpl('index',$data);
    }
}


Как заметили все обрабатывается и хранится в массиве $data

а затем метод класса view делает следующее, покажу только суть :

foreach ($data as $var => $value){
            str_replace("{$var}", $value, $tpl);
        }


Вообщем меняет местами {$var} на значение $value.

Все работает, примерное время выполнение проекта в среднем: 0.0165019035339

У меня складывается определенное чувство, что я делаю плохо выполняя все тяжелые скрипты в массиве, влияет ли это на производительность? или лучше будет все это передавать строкой а там при прохождение по массиву уже использовать eval()?
  • Вопрос задан
  • 2531 просмотр
Решения вопроса 2
RUgaleFF
@RUgaleFF
Да, это очень плохо. Предлагаю два решения:
1. Как ваше, только использовать функцию strtr:
strtr($tpl, array('{$val}' => $val));
2. Рендер производить с помощью require обёрнутым в ob_start(); и ob_end(); Переменные из массива извлечь с помощью extract() а в файле шаблона уже работать с чистыми переменными. К примеру:
$data = ['var1' => 1, 'var2' => 2];
View::render('index', $data);

View::render:
extract($data);
require($viewFile);

Файл view:
<div class="container">
<?php echo $var1; ?>
<?=$var2 ?>
</div>


Собственно, второй метод используется в Yii framework, так что если требуется шустрый шаблонизатор, то лучше заморочиться, но если нужно пару раз прогнать, первый вариант может подойти
Ответ написан
FanatPHP
@FanatPHP
Чебуратор тега РНР
Как всегда, невежество рождает чудовищные идеи и выливается в адские проекты. Начнем с идей

без всяких тяжелых Smarty и Twig
Открою тебе маленькую тайну. "Smarty и Twig" НЕ тяжелые.

PHP сам по себе шаблонизатор
Это правда. Но ты-то не используешь РНР, а используешь свой самопал с реплейсами.

Выполняя все тяжелые скрипты в массиве, влияет ли это на производительность?
ВООБЩЕ НИКАК. Понятие "В массиве" ни малейшего отношения к производительности не имеет. Ну то есть вообще никакого.

при прохождение по массиву уже использовать eval()
Поздравляю, твой сайт взломали!

У меня складывается определенное чувство, что я делаю плохо
Угадал! Только не в том смысле, в котором ты думал. Проблема в другом.

Твоя поделка - вообще не шаблонизатор.

Шаблонизатор - это когда ВЕСЬ HTML пишется в шаблоне. Читай по буквам - В-Е-С-Ь. Это означает, что в коде контроллера не должно быть написано ни одного тега. А при твоей системе у тебя половина HTML будет в контроллере. Зачет не сдан, садись, два.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы