Класс темплейтов

CCCP_MOCKBA

Новичок
Класс темплейтов

Всем здрасти.
Буду очень признателен, если многоуважаемые профи посмотрят написанный мной класс и выскажут замечания или предложения по поводу добавления чего-либо или изменения оного. Заранее благодарю.
http://temp.ric.ua/PHP/class.Template.rar
 

Screjet

Новичок
Если это было домашнее задание, то неплохо. Но до курсовой (имхо) не дотягивает :)

Основной недостаток:
жуткая тормознутость
(в цикле делать replace = плохо).

Преимущества: не обнаружены.:)
 

CCCP_MOCKBA

Новичок
Можно ли поподробнее почему плохо, и как делать в таком случае ?
 

Screjet

Новичок
Представь: у тебя в шаблоне 10 переменных.
Так вот каждый вывод будет обработка: 10 вызовов реплейсов для 10-ти переменных. В итоге с увеличением числа переменных время обработки увеличивается.

Нужно замену делать за один проход, например:
PHP:
class ... {

	function replace(){
		$this->replaced = preg_replace_callback('~\{([a-z0-9_]+)\}~i', array(&$this,'_cback'), $this->content);
	}

	function _cback( $match ){
		return $this->tpl_variables[$match[1]];
	}
}
В итоге за один проход формируешь шаблон. Скорость должна быть не хуже лексического разборщика ПХП :)
 

ONK

Пассивист PHPСluba
Screjet, то что ты советуеш, по моим прикидкам будет работать минимум раза в 3 медленее, чем код выполняющий аналогичную работу с помощью str_replace.

Так что воздержись от необдуманных советов.
 

Screjet

Новичок
Решил тест наваять. Есть над чем поразмышлять и поэкспериментировать.

1) попробовал 10 элементов
2) попробовал 20 элементов
3) попробовал все 30.

Интересные результаты.

код:

PHP:
<?php

class replacer {

	var $vars = array(
		'{TEXT1}'	=> 'This is text label #1',
		'{TEXT2}'	=> 'This is text label #2',
		'{TEXT3}'	=> 'This is text label #3',
		'{TEXT4}'	=> 'This is text label #4',
		'{TEXT5}'	=> 'This is text label #5',
		'{TEXT6}'	=> 'This is text label #6',
		'{TEXT7}'	=> 'This is text label #7',
		'{TEXT8}'	=> 'This is text label #8',
		'{TEXT9}'	=> 'This is text label #9',
		'{TEXT10}'=> 'This is text label #10',
		'{TEXT11}'=> 'This is text label #11',
		'{TEXT12}'=> 'This is text label #12',
		'{TEXT13}'=> 'This is text label #13',
		'{TEXT14}'=> 'This is text label #14',
		'{TEXT15}'=> 'This is text label #15',
		'{TEXT16}'=> 'This is text label #16',
		'{TEXT17}'=> 'This is text label #17',
		'{TEXT18}'=> 'This is text label #18',
		'{TEXT19}'=> 'This is text label #19',
		'{TEXT20}'=> 'This is text label #20',
		'{TEXT21}'=> 'This is text label #21',
		'{TEXT22}'=> 'This is text label #22',
		'{TEXT23}'=> 'This is text label #23',
		'{TEXT24}'=> 'This is text label #24',
		'{TEXT25}'=> 'This is text label #25',
		'{TEXT26}'=> 'This is text label #26',
		'{TEXT27}'=> 'This is text label #27',
		'{TEXT28}'=> 'This is text label #28',
		'{TEXT29}'=> 'This is text label #29',
		'{TEXT30}'=> 'This is text label #30'
	);
	var $search;
	var $replace;

	function replacer(){
		$this->search = array_keys($this->vars);
		$this->replace = array_values($this->vars);
	}

	function pcb_replace( $tpl ){
		return preg_replace_callback('~(\{[a-z0-9]+\})~i', array(&$this,'_cback'), $tpl);
	}

	function _cback( $match ){
		return $this->vars[$match[1]];
	}

	function str_replace( $tpl ){
		return str_replace($this->search, $this->replace, $tpl);
	}
}

function getmicrotime(){ 
	list($usec, $sec) = explode(' ',microtime()); 
	return ((float)$usec + (float)$sec); 
}

$tpl_a = array(
"bla-bla-bla-la Replace string label: {TEXT1}",
"bla-bla-bla-la Replace string label: {TEXT2}",
"bla-bla-bla-la Replace string label: {TEXT3}",
"bla-bla-bla-la Replace string label: {TEXT4}",
"bla-bla-bla-la Replace string label: {TEXT5}",
"bla-bla-bla-la Replace string label: {TEXT6}",
"bla-bla-bla-la Replace string label: {TEXT7}",
"bla-bla-bla-la Replace string label: {TEXT8}",
"bla-bla-bla-la Replace string label: {TEXT9}",
"bla-bla-bla-la Replace string label: {TEXT10}",
"bla-bla-bla-la Replace string label: {TEXT11}",
"bla-bla-bla-la Replace string label: {TEXT12}",
"bla-bla-bla-la Replace string label: {TEXT13}",
"bla-bla-bla-la Replace string label: {TEXT14}",
"bla-bla-bla-la Replace string label: {TEXT15}",
"bla-bla-bla-la Replace string label: {TEXT16}",
"bla-bla-bla-la Replace string label: {TEXT17}",
"bla-bla-bla-la Replace string label: {TEXT18}",
"bla-bla-bla-la Replace string label: {TEXT19}",
"bla-bla-bla-la Replace string label: {TEXT20}",
"bla-bla-bla-la Replace string label: {TEXT21}",
"bla-bla-bla-la Replace string label: {TEXT22}",
"bla-bla-bla-la Replace string label: {TEXT23}",
"bla-bla-bla-la Replace string label: {TEXT24}",
"bla-bla-bla-la Replace string label: {TEXT25}",
"bla-bla-bla-la Replace string label: {TEXT26}",
"bla-bla-bla-la Replace string label: {TEXT27}",
"bla-bla-bla-la Replace string label: {TEXT28}",
"bla-bla-bla-la Replace string label: {TEXT29}",
"bla-bla-bla-la Replace string label: {TEXT30}"
);

$a = array();
for( $i=0; $i<10; $i++ ){
	shuffle($tpl_a);
	$a = array_merge($a, $tpl_a);
}
$tpl = implode(" ", $a );

echo 'Template size: '. strlen($tpl) ." bytes\n";

$r = new replacer();

$tm1 = getmicrotime();
for( $i=0; $i<100; $i++ ){
	$r->pcb_replace($tpl);
}
$tm2 = getmicrotime();
echo 'For $r->pcb_replace() time:';
echo $tm2 - $tm1;
echo "\n";
//
$tm1 = getmicrotime();
for( $i=0; $i<100; $i++ ){
	$r->str_replace($tpl);
}
$tm2 = getmicrotime();
echo 'For $r->str_replace() time:';
echo $tm2 - $tm1;
echo "\n";

?>
 
Сверху