Вы не зашли.
Главная »
PHP » леспед шаблонизатора! надо поправить
#1.
Nu3oN
Off
(11)
Moderator
2010.10.09 19:07
короче очередная моя попытка написания шаблонизатора!
даже не спрашивайте зачем он мне, и не говорите что либо в плане того что надо юзать уже готовые решения...
короче вот отрывок небольшой
Код:
span style="color: #0000BB"><?phpclass Template { /** Переменные шаблона */ private $_variable = array(); /** Массивы шаблона */ private $_array = array(); /** Папка с шаблонами по умолчанию */ public $dir_temp = './_template/'; /** * Установка переменных в шаблоне */ public function assign($var, $key) { if (is_array($key)) { $this -> _array[$var] = $key; } else { $this -> _variable[$var] = $key; } } /** * Обработка переменных в шаблоне */ private function _varPreg($getTpl) { preg_match_all('#\{\$(.+)\}#uUs', $getTpl, $aVars, PREG_SET_ORDER); $iCount = count($aVars); if ($iCount) { for ($i=0; $i<$iCount; $i++) { $sEval = explode('.', $aVars[$i]['1']); $iCount_r = count($sEval); if ($iCount_r > 1) { if (isset($this->_array[$sEval[0]]) and array_key_exists($sEval['1'], $this -> _array[$sEval[0]])) { $isVar = $this -> _array[$sEval[0]]; $getTpl = str_replace('{$'.$sEval['0'].'.'.$sEval['1'].'}', $isVar[$sEval['1']], $getTpl); } else { $getTpl = str_replace('{$'.$sEval['0'].'.'.$sEval['1'].'}', null, $getTpl); } } else { if (isset($this -> _variable[$sEval['0']])) { $getTpl = str_replace('{$'.$sEval['0'].'}', $this -> _variable[$sEval['0']], $getTpl); } else { $getTpl = str_replace('{$'.$sEval['0'].'}', null, $getTpl); } } } } return $getTpl; } /** * Вывод шаблона */ public function displey($tpl) { if (!is_file($this -> dir_temp.$tpl)) { return false; } else { $getTpl = file_get_contents($this -> dir_temp.$tpl); $getTpl = $this -> _varPreg($getTpl); echo $getTpl; } }}?> |
нужна чисто оценка и что можно сделать иначе и т.д и т.п и почему лучше сделать так или иначе...
Я буду лучше голоден, но между креслом и рулем и на дороге.
#2.
Nu3oN
Off
(11)
Moderator
2010.10.09 19:07
Стараюсь больше косить к smarty (одинаковые названия свойств, методов и т.д)... в случае если мне это дело надоест, что бы установить смарти без проблем!
Добавлено спустя 2 минуты 31 секунду: и что думаете на счет кеширование в gz-файле?
есть ли выгода в таком мини сжатия кеша?
Я буду лучше голоден, но между креслом и рулем и на дороге.
Nu3oN, насчет кэширования в GZ, ИМХО пустое это. Проигрыш в скорости будет много больше чем выигрыш в размере занимаемого диска.
И снова, оформи код по PEAR и комментарии с описанием методов расширь хотя бы входящими/исходящими данными.
Добавлено спустя 8 минут 2 секунды: $sEval['0']
$sEval['1']
где-то тут на форуме есть тесты производительности, там вобщем показано, что $sEval[0] будет быстрее чем $sEval['0']. Т.е. числовые индексы быстрее ассоциативных, да и памяти число таки меньше жрет.
public function displey - не displey, а display.
Код:
$getTpl = file_get_contents($this -> dir_temp.$tpl); |
$getTpl = $this -> _varPreg($getTpl); |
echo $getTpl; |
мелочи, но шаблонизатор таки должен быть реально быстрым.
Код:
echo $this -> _varPreg(file_get_contents($this -> dir_temp . $tpl)); |
#4.
Nu3oN
Off
(11)
Moderator
2010.10.10 06:06
я как то читал что $array['0'] быстрей чем $array[0]
Я буду лучше голоден, но между креслом и рулем и на дороге.
#5.
Nu3oN
Off
(11)
Moderator
2010.10.10 07:07
Действительно $array[0] быстрей чем $array['0']
Код:
span style="color: #0000BB"><?php$arr = array('1'=>'1234567890');$iStart_1 = microtime(true);for ($i=0; $i<100000; $i++) $set = $arr['1'];$iEnd_1 = round(microtime(true) - $iStart_1, 4);$iStart_2 = microtime(true);for ($i=0; $i<100000; $i++) $set = $arr[1];$iEnd_2 =round(microtime(true) - $iStart_2, 4);echo '$arr[\'1\']: '.$iEnd_1.'<br> $arr[1]: '.$iEnd_2;?> |
В итоге получилось следущее:
$arr['1']: 0.0786, 0.0735, 0.0728, 0.0767
$arr[1]: 0.0396, 0.0444, 0.043, 0.0406
Отредактировано Nu3oN (2010.10.10 07:07)
Я буду лучше голоден, но между креслом и рулем и на дороге.
#6.
Nu3oN
Off
(11)
Moderator
2010.10.10 08:08
вот еще один лесапед!
Код:
span style="color: #0000BB"><?php private function _cyclePreg($getTpl) { /** * Ищем цикл */ preg_match_all('#\{foreach (\$(.*))\}(.*?)\{\/foreach\}#uUs', $getTpl, $aCycle, PREG_SET_ORDER); $cycle = null; /** * Считаем колличество эллементов в массиве, * если их больше нуля, то продолжаем работу с циклом */ $iCountC = isset($this -> _array[$aCycle[0][2]]) ? count($aCycle) : false; if ($iCountC) { $arrCycle = $this -> _array[$aCycle[0][2]]; /** * Считаем колличество эллементов в массиве с которым работаем */ $iCount = count($arrCycle); for ($i=0; $i<$iCount; $i++) { $sFor[$i] = $aCycle['0']['3']; /** * Ищем массивы в цикле */ preg_match_all('#\{\$(.+)\}#uUs', $aCycle[0][3], $aVars, PREG_SET_ORDER); $iCount_v = count($aVars); /** * Если массивы есть, то обрабатываем их */ if ($iCount_v) { for ($n=0; $n<$iCount_v; $n++) { /** * Получаем переменную и ключ * Пример: из {$arr.key} в $arr['key'] */ $sEval = explode('.', $aVars[$n][1]); $iCount_r = count($sEval); if ($iCount_r > 1) { if (isset($arrCycle[$i][$sEval[1]]) and array_key_exists($sEval[1], $arrCycle[$i])) { /** * Если такая переменная заявленна, * и в массиве есть значение с таким ключом то заменяем на действительную */ $sFor[$i] = str_replace('{$'.$aCycle[0][2].'.'.$sEval[1].'}', $arrCycle[$i][$sEval[1]], $sFor[$i]); } else { /** * Если такая переменная не заявленна, то просто затераем ее */ $sFor[$i] = str_replace('{$'.$aCycle[0][2].'.'.$sEval[1].'}', null, $sFor[$i]); } } } } $cycle .= $sFor[$i]; } } /** * И заменяем текст на реальный цикл */ return preg_replace('#\{foreach (\$(.*))\}(.*?)\{\/foreach\}#uUs', $cycle, $getTpl); }?> |
Это осуществление циклов...
Пока писал, запутался конкретно...
Отредактировано Nu3oN (2010.10.10 09:09)
Я буду лучше голоден, но между креслом и рулем и на дороге.
это на тебя морган такое плохое влияние оказывает чтоли?)))
#8.
Nu3oN
Off
(11)
Moderator
2010.10.10 09:09
Гыыыы... если серьезно, то решение написать свой шаблонизатор у меня возникло из за того, что я знаю что если мне что-то нужно, я знаю где это поправить и понимать что к чему!
В своем шаблонизаторе я организовал вывод всех массивов, переменных, методов, время генерации какого либо метода, вывод ошибок (как пример: если в шаблоне обьявлена переменная {$var} но в скрипте небыла заявленна, то мне выдает название переменной и строку) следя за такими ошибками можно управлять генерацией скрипта...
В общем у меня полный контроль над шаблонизатором
Отредактировано Nu3oN (2010.10.10 09:09)
Я буду лучше голоден, но между креслом и рулем и на дороге.
#9.
Morgan
Off
(10)
Участник
2010.10.10 18:06
Gemorroj написал:
это на тебя морган такое плохое влияние оказывает чтоли?)))
а я все вижу)))
Натан ротшильд :
Кто владеет информацией, тот владеет миром
#10.
Nu3oN
Off
(11)
Moderator
2010.10.11 03:03
Morgan написал:Gemorroj написал:
это на тебя морган такое плохое влияние оказывает чтоли?)))
а я все вижу)))
Тебе так только кажется
Добавлено спустя 1 минуту 56 секунд: теперь осталось написать функции и конструкцию if else
Отредактировано Nu3oN (2010.10.11 09:09)
Я буду лучше голоден, но между креслом и рулем и на дороге.
выкладывай код на публичный репозитарий, личензируй GPL какойнить и вперед, развивай, поддерживай.
#12.
Nu3oN
Off
(11)
Moderator
2010.10.11 09:09
не люблю выкладывать скрипты в пабл... Не люблю дальнейшие высеры и обсерания автора и его работы
Я буду лучше голоден, но между креслом и рулем и на дороге.
12, ты же выкладываешь не просто так.
высеры появляются только тогда, когда человеку больше нечего сказать
Натан ротшильд :
Кто владеет информацией, тот владеет миром
#14.
Nu3oN
Off
(11)
Moderator
2010.10.11 14:02
вот думаю как правильней организовать иф елсе...
Что бы не тупо иф елсе, а еще по необходимости например штук 10 этих елсеифоф и т.д...
Я буду лучше голоден, но между креслом и рулем и на дороге.
#15.
Nu3oN
Off
(11)
Moderator
2010.10.15 20:08
Короче вот что в итоге у меня выходит:
Пример тута
Отредактировано Nu3oN (2010.10.15 20:08)
Я буду лучше голоден, но между креслом и рулем и на дороге.
кэширование оттранслированного кода планируется?
#17.
Nu3oN
Off
(11)
Moderator
2010.10.16 08:08
Gemorroj написал:
кэширование оттранслированного кода планируется?
ну да...
Я буду лучше голоден, но между креслом и рулем и на дороге.
Ну вперед, ИМХО, это должно быть обязательно. Для WAP, отсутствие кэша, может, и не так заметно, но для WEB страничек, нагруженных HTML'ом, это важно.
Циклы в цикле это издевательство, со смарти слезать не хочу. Как-то читал что кодеры делятся на несколько типов. Высшим оказался тот, который пишет свой шаблонизатор. Я написал себе давно мини шаблонизатор, но заюзав смарти выкинул мой тэмплейтер к черту. Твиг думал заюзать, но считаю что он тупой, просто неудобный. Говорят смарти медленный, ну-ну, 0.0081 вместе с использованием бд и обширным ядром. Считаю что написание своего шаблонизатора - бред (ну3он, морган-извиняйте уж).
достаточно холиварная тема. Если уж лесапеды не используешь, тогда почему пишешь не с использованием kohana, cakephp, etc ?
Натан ротшильд :
Кто владеет информацией, тот владеет миром
#21.
Nu3oN
Off
(11)
Moderator
2010.11.04 21:09
насчет "циклы в цикле", предложи лучший вариант, я гляну

Дай свой шаблонизатор глянуть
Я буду лучше голоден, но между креслом и рулем и на дороге.