Forums / National / Russian / Шаблонизатор

dervan
#9614 2009-03-09 22:08
# medar : Кто-нибудь может прокомментировать, что происходит ? :) Как-то это всё нелогично..
Получается, что по ссылке на $GLOBALS парсинг работает дольше, чем при использовании локальной копии.

================

medar, я извиняюсь - не пойдёт этот хак scan_globals().

Во-первых, я не учёл, что после такой переделки весь $GLOBALS можно убить методом assign(), например так:
$t->assign('PHP', 'test_assign');
$t->assign(array('PHP' => 'test_assign_array'));

Добавлял в конец system/header.php такой код, всё так и есть - $GLOBALS уничтожается:
$t->assign('PHP', 'test_assign');

$t->parse("HEADER");
$t->out("HEADER");

echo '<pre>', strip_tags(print_r($GLOBALS, true)), '</pre>';

В принципе, можно в методе assign() проверять ключ на значение 'PHP' и не присваивать в этом случае значение. Но $GLOBALS всё равно можно убить напрямую через vars:
$t->vars['PHP'] = 'test_assign';
А vars - public, и менять это нельзя, могут отказаться работать какие-нибудь плагины.

К тому же есть нюансы при работе метода parse(). Например, такой код в конце system/header.php, плюс тег {PHP.TEST_DEFINE) в header.tpl:
define('TEST_DEFINE', 'test_define');
$TEST_DEFINE = '';

$t->parse("HEADER");
$t->out("HEADER");

echo $TEST_DEFINE, '<br />';
В случае оригинального scan_globals() глобальная переменная $TEST_DEFINE останется пустой строкой (значение будет присвоено её копии), а с переделанным scan_globals() после работы парсера $TEST_DEFINE получит значение 'test_define'.

И вдобавок по твоим тестам с переделанным scan_globals() парсер работает медленнее. Так что в сад. :)

Ещё раз извиняюсь.