diff --git a/src/Data.php b/src/Data.php index f411aaea..cd98dcc4 100644 --- a/src/Data.php +++ b/src/Data.php @@ -155,12 +155,7 @@ abstract class Data public function assignGlobal($varName, $value = null, $nocache = false) { if ($varName !== '') { - Smarty::$global_tpl_vars[ $varName ] = new \Smarty\Variable($value, $nocache); - $ptr = $this; - while ($ptr->_isTplObj()) { - $ptr->tpl_vars[ $varName ] = clone Smarty::$global_tpl_vars[ $varName ]; - $ptr = $ptr->parent; - } + $this->_getSmartyObj()->setGlobalVariable($varName, new \Smarty\Variable($value, $nocache)); } return $this; } @@ -256,8 +251,8 @@ abstract class Data $_ptr = null; } } - if ($searchParents && isset(Smarty::$global_tpl_vars)) { - foreach (Smarty::$global_tpl_vars as $key => $var) { + if ($searchParents) { + foreach ($this->_getSmartyObj()->getAllGlobalTemplateVars() as $key => $var) { if (!array_key_exists($key, $_result)) { $_result[ $key ] = $var->value; } @@ -298,9 +293,9 @@ abstract class Data $_ptr = null; } } - if (isset(Smarty::$global_tpl_vars[ $varName ])) { + if ($this->_getSmartyObj()->getGlobalVariable($varName)) { // found it, return it - return Smarty::$global_tpl_vars[ $varName ]; + return $this->_getSmartyObj()->getGlobalVariable($varName); } if ($errorEnable && $this->_getSmartyObj()->error_unassigned) { // force a notice @@ -542,14 +537,14 @@ abstract class Data public function getGlobal($varName = null) { if (isset($varName)) { - if (isset(Smarty::$global_tpl_vars[ $varName ])) { - return Smarty::$global_tpl_vars[ $varName ]->value; + if ($this->_getSmartyObj()->getGlobalVariable($varName)) { + return $this->_getSmartyObj()->getGlobalVariable($varName)->getValue(); } else { return ''; } } else { - $_result = array(); - foreach (Smarty::$global_tpl_vars as $key => $var) { + $_result = []; + foreach ($this->_getSmartyObj()->getAllGlobalTemplateVars() as $key => $var) { $_result[ $key ] = $var->value; } return $_result; diff --git a/src/Debug.php b/src/Debug.php index bb7275da..2bba87ec 100644 --- a/src/Debug.php +++ b/src/Debug.php @@ -308,7 +308,7 @@ class Debug extends Data } $config_vars = array_merge($parent->config_vars, $config_vars); } else { - foreach (\Smarty\Smarty::$global_tpl_vars as $key => $var) { + foreach ($this->_getSmartyObj()->getAllGlobalTemplateVars() as $key => $var) { if (!array_key_exists($key, $tpl_vars)) { foreach ($var as $varkey => $varvalue) { if ($varkey === 'value') { diff --git a/src/Smarty.php b/src/Smarty.php index 7dede602..77efef42 100644 --- a/src/Smarty.php +++ b/src/Smarty.php @@ -96,7 +96,7 @@ class Smarty extends \Smarty\TemplateBase /** * assigned global tpl vars */ - public static $global_tpl_vars = array(); + private $global_tpl_vars = []; /** * The character set to adhere to (defaults to "UTF-8") @@ -563,15 +563,11 @@ class Smarty extends \Smarty\TemplateBase */ public function __construct() { - $this->_clearTemplateCache(); parent::__construct(); if (is_callable('mb_internal_encoding')) { mb_internal_encoding(\Smarty\Smarty::$_CHARSET); } $this->start_time = microtime(true); - if (isset($_SERVER[ 'SCRIPT_NAME' ])) { - \Smarty\Smarty::$global_tpl_vars[ 'SCRIPT_NAME' ] = new \Smarty\Variable($_SERVER[ 'SCRIPT_NAME' ]); - } // Check if we're running on Windows \Smarty\Smarty::$_IS_WINDOWS = strtoupper(substr(PHP_OS, 0, 3)) === 'WIN'; // let PCRE (preg_*) treat strings as ISO-8859-1 if we're not dealing with UTF-8 @@ -996,7 +992,7 @@ class Smarty extends \Smarty\TemplateBase * @param mixed $cache_id cache id to be used with this template * @param mixed $compile_id compile id to be used with this template * @param object $parent next higher level of Smarty variables - * @param boolean $do_clone flag is Smarty object shall be cloned + * @param boolean $do_clone flag is template object shall be cloned * * @return \Smarty\Template template object * @throws \Smarty\Exception @@ -1017,22 +1013,10 @@ class Smarty extends \Smarty\TemplateBase $this->_normalizeTemplateConfig(false); } $_templateId = $this->_getTemplateId($template, $cache_id, $compile_id); - if ($this->caching && isset(\Smarty\Template::$isCacheTplObj[ $_templateId ])) { - $tpl = $do_clone ? clone \Smarty\Template::$isCacheTplObj[ $_templateId ] : - \Smarty\Template::$isCacheTplObj[ $_templateId ]; - $tpl->inheritance = null; - $tpl->tpl_vars = $tpl->config_vars = array(); - } elseif (!$do_clone && isset(\Smarty\Template::$tplObjCache[ $_templateId ])) { - $tpl = clone \Smarty\Template::$tplObjCache[ $_templateId ]; - $tpl->inheritance = null; - $tpl->tpl_vars = $tpl->config_vars = array(); - } else { - $tpl = new \Smarty\Template($template, $this, null, $cache_id, $compile_id, null, null); - $tpl->templateId = $_templateId; - } - if ($do_clone) { - $tpl->smarty = clone $tpl->smarty; - } + + $tpl = new \Smarty\Template($template, $this, null, $cache_id, $compile_id, null, null); + $tpl->templateId = $_templateId; + $tpl->parent = $parent ? $parent : $this; // fill data if present if (!empty($data) && is_array($data)) { @@ -1132,15 +1116,6 @@ class Smarty extends \Smarty\TemplateBase return $realpath !== false ? $parts[ 'root' ] . $path : str_ireplace(getcwd(), '.', $parts[ 'root' ] . $path); } - /** - * Empty template objects cache - */ - public function _clearTemplateCache() - { - \Smarty\Template::$isCacheTplObj = array(); - \Smarty\Template::$tplObjCache = array(); - } - /** * @param boolean $use_sub_dirs */ @@ -1386,7 +1361,6 @@ class Smarty extends \Smarty\TemplateBase $compile_id = null, $exp_time = null ) { - $this->_clearTemplateCache(); return $this->getCacheResource()->clear($this, $template_name, $cache_id, $compile_id, $exp_time); } @@ -1403,7 +1377,6 @@ class Smarty extends \Smarty\TemplateBase */ public function clearAllCache($exp_time = null) { - $this->_clearTemplateCache(); return $this->getCacheResource()->clearAll($this, $exp_time); } @@ -1422,8 +1395,6 @@ class Smarty extends \Smarty\TemplateBase */ public function clearCompiledTemplate($resource_name = null, $compile_id = null, $exp_time = null) { - // clear template objects cache - $this->_clearTemplateCache(); $_compile_dir = $this->getCompileDir(); if ($_compile_dir === '/') { //We should never want to delete this! return 0; @@ -1629,7 +1600,6 @@ class Smarty extends \Smarty\TemplateBase } // free memory unset($_tpl); - $_smarty->_clearTemplateCache(); if ($max_errors !== null && $_error_count === $max_errors) { echo "\ntoo many errors\n"; exit(1); @@ -2250,5 +2220,36 @@ class Smarty extends \Smarty\TemplateBase $this->cacheResource = $cacheResource; } + /** + * Sets a global variable, available in all templates + * + * @param string $varName + * @param Variable $param + * + * @return void + */ + public function setGlobalVariable(string $varName, Variable $param) { + $this->global_tpl_vars[$varName] = $param; + } + + /** + * Returns all global variables + * + * @return array + */ + public function getAllGlobalTemplateVars() { + return $this->global_tpl_vars; + } + + /** + * Returns a single global variable, or null if not found. + * @param string $varName + * + * @return Variable|null + */ + public function getGlobalVariable(string $varName): ?Variable { + return $this->global_tpl_vars[$varName] ?? null; + } + } diff --git a/src/Template.php b/src/Template.php index 6b6f9d4d..9d9909fa 100644 --- a/src/Template.php +++ b/src/Template.php @@ -27,20 +27,6 @@ use Smarty\Template\Config; #[\AllowDynamicProperties] class Template extends TemplateBase { - /** - * Template object cache - * - * @var Template[] - */ - public static $tplObjCache = []; - - /** - * Template object cache for Smarty::isCached() === true - * - * @var Template[] - */ - public static $isCacheTplObj = []; - /** * Sub template Info Cache * - index name @@ -282,45 +268,25 @@ class Template extends TemplateBase { $_templateId = $smarty->_getTemplateId($template, $cache_id, $compile_id, $caching, $tpl); // recursive call ? if ((isset($tpl->templateId) ? $tpl->templateId : $tpl->_getTemplateId()) !== $_templateId) { - // already in template cache? - if (isset(self::$tplObjCache[$_templateId])) { - // copy data from cached object - $cachedTpl = &self::$tplObjCache[$_templateId]; - $tpl->templateId = $cachedTpl->templateId; - $tpl->template_resource = $cachedTpl->template_resource; - $tpl->cache_id = $cachedTpl->cache_id; - $tpl->compile_id = $cachedTpl->compile_id; - $tpl->source = $cachedTpl->source; - if (isset($cachedTpl->compiled)) { - $tpl->compiled = $cachedTpl->compiled; - } else { - unset($tpl->compiled); - } - if ($caching !== 9999 && isset($cachedTpl->cached)) { - $tpl->cached = $cachedTpl->cached; - } else { - unset($tpl->cached); - } + + $tpl->templateId = $_templateId; + $tpl->template_resource = $template; + $tpl->cache_id = $cache_id; + $tpl->compile_id = $compile_id; + if (isset($uid)) { + // for inline templates we can get all resource information from file dependency + [$filepath, $timestamp, $type] = $tpl->compiled->file_dependency[$uid]; + $tpl->source = new Source($smarty, $filepath, $type, $filepath); + $tpl->source->filepath = $filepath; + $tpl->source->timestamp = $timestamp; + $tpl->source->exists = true; + $tpl->source->uid = $uid; } else { - $tpl->templateId = $_templateId; - $tpl->template_resource = $template; - $tpl->cache_id = $cache_id; - $tpl->compile_id = $compile_id; - if (isset($uid)) { - // for inline templates we can get all resource information from file dependency - [$filepath, $timestamp, $type] = $tpl->compiled->file_dependency[$uid]; - $tpl->source = new Source($smarty, $filepath, $type, $filepath); - $tpl->source->filepath = $filepath; - $tpl->source->timestamp = $timestamp; - $tpl->source->exists = true; - $tpl->source->uid = $uid; - } else { - $tpl->source = Source::load($tpl); - unset($tpl->compiled); - } - if ($caching !== 9999) { - unset($tpl->cached); - } + $tpl->source = Source::load($tpl); + unset($tpl->compiled); + } + if ($caching !== 9999) { + unset($tpl->cached); } } else { // on recursive calls force caching @@ -330,15 +296,7 @@ class Template extends TemplateBase { $tpl->cache_lifetime = $cache_lifetime; // set template scope $tpl->scope = $scope; - if (!isset(self::$tplObjCache[$tpl->templateId]) && !$tpl->source->handler->recompiled) { - // check if template object should be cached - if ($forceTplCache || (isset(self::$subTplInfo[$tpl->template_resource]) - && self::$subTplInfo[$tpl->template_resource] > 1) - || ($tpl->_isSubTpl() && isset(self::$tplObjCache[$tpl->parent->templateId])) - ) { - self::$tplObjCache[$tpl->templateId] = $tpl; - } - } + if (!empty($data)) { // set up variable values foreach ($data as $_key => $_val) { @@ -810,7 +768,7 @@ class Template extends TemplateBase { $mergedScope = $tagScope | $this->scope; if ($mergedScope) { if ($mergedScope & \Smarty\Smarty::SCOPE_GLOBAL && $varName) { - \Smarty\Smarty::$global_tpl_vars[$varName] = $this->tpl_vars[$varName]; + $this->_getSmartyObj()->setGlobalVariable($varName, $this->tpl_vars[$varName]); } // update scopes foreach ($this->_getAffectedScopes($mergedScope) as $ptr) { diff --git a/src/TemplateBase.php b/src/TemplateBase.php index 6eb10fd3..1e6bad8b 100644 --- a/src/TemplateBase.php +++ b/src/TemplateBase.php @@ -194,7 +194,6 @@ abstract class TemplateBase extends Data { $template->loadCached(); } $result = $template->cached->isCached($template); - Template::$isCacheTplObj[$template->_getTemplateId()] = $template; } else { return false; } @@ -204,21 +203,15 @@ abstract class TemplateBase extends Data { $savedConfigVars = $template->config_vars; } ob_start(); + $template->_mergeVars(); - if (!empty(\Smarty\Smarty::$global_tpl_vars)) { - $template->tpl_vars = array_merge(\Smarty\Smarty::$global_tpl_vars, $template->tpl_vars); - } + $template->tpl_vars = array_merge($this->_getSmartyObj()->getAllGlobalTemplateVars(), $template->tpl_vars); + $result = $template->render(false, $function); $template->_cleanUp(); if ($saveVars) { $template->tpl_vars = $savedTplVars; $template->config_vars = $savedConfigVars; - } else { - if (!$function && !isset(Template::$tplObjCache[$template->templateId])) { - $template->parent = null; - $template->tpl_vars = $template->config_vars = []; - Template::$tplObjCache[$template->templateId] = $template; - } } } diff --git a/src/Variable.php b/src/Variable.php index eb7449eb..b5fabd47 100644 --- a/src/Variable.php +++ b/src/Variable.php @@ -38,6 +38,10 @@ class Variable $this->nocache = $nocache; } + public function getValue() { + return $this->value; + } + /** * <> String conversion * diff --git a/tests/UnitTests/SmartyMethodsTests/AssignGlobal/AssignGlobalTest.php b/tests/UnitTests/SmartyMethodsTests/AssignGlobal/AssignGlobalTest.php index b9010c3e..19985832 100644 --- a/tests/UnitTests/SmartyMethodsTests/AssignGlobal/AssignGlobalTest.php +++ b/tests/UnitTests/SmartyMethodsTests/AssignGlobal/AssignGlobalTest.php @@ -42,7 +42,6 @@ class AssignGlobalTest extends PHPUnit_Smarty $this->smarty->assignGlobal('foo', array('foo' => 'bar', 'foo2' => 'bar2')); $a1 = array('foo' => array('foo' => 'bar', 'foo2' => 'bar2')); $a2 = $this->smarty->getGlobal(); - unset($a2['SCRIPT_NAME']); $this->assertTrue($a1 === $a2); } diff --git a/tests/UnitTests/SmartyMethodsTests/ClearAllAssign/ClearAllAssignTest.php b/tests/UnitTests/SmartyMethodsTests/ClearAllAssign/ClearAllAssignTest.php index b56fff9a..f9caa8a6 100644 --- a/tests/UnitTests/SmartyMethodsTests/ClearAllAssign/ClearAllAssignTest.php +++ b/tests/UnitTests/SmartyMethodsTests/ClearAllAssign/ClearAllAssignTest.php @@ -8,15 +8,11 @@ /** * class for clearing all assigned variables tests - * - * - * - * */ class ClearAllAssignTest extends PHPUnit_Smarty { - protected $_data = null; - protected $_tpl = null; + private $_data = null; + private $_tpl = null; public function setUp(): void { diff --git a/tests/UnitTests/TemplateSource/TagTests/BockExtend/CompileBlockExtendsTest.php b/tests/UnitTests/TemplateSource/TagTests/BockExtend/CompileBlockExtendsTest.php index b389da4b..95f8dd5b 100644 --- a/tests/UnitTests/TemplateSource/TagTests/BockExtend/CompileBlockExtendsTest.php +++ b/tests/UnitTests/TemplateSource/TagTests/BockExtend/CompileBlockExtendsTest.php @@ -575,7 +575,6 @@ class CompileBlockExtendsTest extends PHPUnit_Smarty $result = $this->smarty->fetch($tpl); $this->assertStringContainsString('(grand|b)content grand b(grand|/b)(child|b)content child b(child|/b)(parent|b)content parent b(parent|/b)', $result); - $this->smarty->_clearTemplateCache(); $this->smarty->assign('parent', 'parent2'); $this->smarty->assign('child', 'child2', true); $this->smarty->assign('grand', 'grand2', true); @@ -630,7 +629,6 @@ class CompileBlockExtendsTest extends PHPUnit_Smarty $result = $this->smarty->fetch($tpl); $this->assertStringContainsString('(grand|b)content grand4 b(grand|/b)(child|b)content child4 b(child|/b)(parent|b)content parent4 b(parent|/b)', $result); - $this->smarty->_clearTemplateCache(); $this->smarty->assign('parent', 'parent5'); $this->smarty->assign('child', 'child5', true); $this->smarty->assign('grand', 'grand5', true); diff --git a/tests/UnitTests/__shared/PHPunitplugins/function.checkvar.php b/tests/UnitTests/__shared/PHPunitplugins/function.checkvar.php index e1bfd21a..7a27073e 100644 --- a/tests/UnitTests/__shared/PHPunitplugins/function.checkvar.php +++ b/tests/UnitTests/__shared/PHPunitplugins/function.checkvar.php @@ -13,11 +13,11 @@ use Smarty\Template; * Smarty {checkvar} * * @param array $params parameter array - * @param object $template template object + * @param Template $template template object * * @return string */ -function smarty_function_checkvar($params, $template) +function smarty_function_checkvar($params, \Smarty\Template $template) { $output = ''; $types = array('template', 'data', 'smarty', 'global'); @@ -52,8 +52,8 @@ function smarty_function_checkvar($params, $template) } if (in_array('global', $types)) { $output .= "#global:\${$var} ="; - $output .= isset(\Smarty\Smarty::$global_tpl_vars[ $var ]) ? - preg_replace('/\s/', '', var_export(\Smarty\Smarty::$global_tpl_vars[ $var ]->value, true)) : '>unassigned<'; + $output .= $template->_getSmartyObj()->getGlobalVariable($var) ? + preg_replace('/\s/', '', var_export($template->_getSmartyObj()->getGlobalVariable($var)->getValue(), true)) : '>unassigned<'; } return $output; }