Smarty::$_tpl_vars - 未定义 属性 - 在 Smarty 3 中支持 _tpl_vars
Smarty::$_tpl_vars - Undefined property - Support for _tpl_vars in Smarty 3
我正在将旧的 PHP 5.2.14 和 Smarty 2.6.19 迁移到 PHP 7.3.25 + Smarty 3.1.34。
PHP 代码库非常庞大,我使用了 Smarty::_tpl_vars 数组来访问分配的变量。
$smarty->assign("myvar","var-value");
$myvar = $smarty->_tpl_vars['myvar']; #this returns "var-value"
此方法似乎已被弃用并替换为 getTemplateVars
在较新版本的 Smarty
中有 _tpl_vars 的解决方法吗
您可以创建一个 polyfill class,它通过实现 ArrayAccess
接口来包装 getTemplateVars
方法,并将其作为 _tpl_vars
分配给 Smarty 实例。您可能希望在您的应用程序中非常仔细地测试这个。这是一个概念证明,我刚刚提出并测试了这个答案以证明它是可能的。
特别是您应该检查是否需要在您的 PHP 5.2 代码中通过引用将 Smarty 实例传递到构造函数中 - 我现在只有 7.4 方便测试。
<?php
class TplVarsPolyfill implements ArrayAccess
{
private $_smarty;
public function __construct(Smarty $smarty)
{
$this->_smarty = $smarty;
}
public function offsetSet($varName, $value)
{
$this->_smarty->assign($varName, $value);
}
public function offsetExists($offset)
{
$tplVars = $this->_smarty->getTemplateVars();
return isset($tplVars[$offset]);
}
public function offsetUnset($varName)
{
$this->_smarty->clearAssign($varName);
}
public function offsetGet($offset)
{
$tplVars = $this->_smarty->getTemplateVars();
return isset($tplVars[$offset]) ? $tplVars[$offset] : null;
}
/**
* This is required to convince Smarty to set the instance
* @see Smarty::__set
* @return mixed
*/
public function _tpl_vars()
{
return $this->_smarty->getTemplateVars();
}
}
$smarty = new Smarty();
$smarty->_tpl_vars = new TplVarsPolyfill($smarty);
$testVarName = 'foo';
$testVal = 'bar';
$smarty->assign($testVarName, $testVal);
assert($smarty->_tpl_vars[$testVarName]==$testVal, 'Value in polyfill should match what was assigned via assign()');
$polyfillVarName = 'animal';
$polyfillVal = 'wombat';
$smarty->_tpl_vars[$polyfillVarName] = $polyfillVal;
$smartyTemplateVars = $smarty->getTemplateVars();
assert($smartyTemplateVars[$polyfillVarName]==$polyfillVal, 'Value in getTemplateVars() should match what was assigned via polyfill');
通过在 PHP 5.2/Smarty 2
的 Smarty.class.php 中添加以下代码片段来管理解决方法
function getTemplateVars($name=null)
{
return $this->_tpl_vars[$name];
}
我会将所有 $smarty->_tpl_vars[] 替换为 $smarty->getTemplateVars() 和这个确保向后兼容性的方法。
我正在将旧的 PHP 5.2.14 和 Smarty 2.6.19 迁移到 PHP 7.3.25 + Smarty 3.1.34。
PHP 代码库非常庞大,我使用了 Smarty::_tpl_vars 数组来访问分配的变量。
$smarty->assign("myvar","var-value");
$myvar = $smarty->_tpl_vars['myvar']; #this returns "var-value"
此方法似乎已被弃用并替换为 getTemplateVars
在较新版本的 Smarty
中有 _tpl_vars 的解决方法吗您可以创建一个 polyfill class,它通过实现 ArrayAccess
接口来包装 getTemplateVars
方法,并将其作为 _tpl_vars
分配给 Smarty 实例。您可能希望在您的应用程序中非常仔细地测试这个。这是一个概念证明,我刚刚提出并测试了这个答案以证明它是可能的。
特别是您应该检查是否需要在您的 PHP 5.2 代码中通过引用将 Smarty 实例传递到构造函数中 - 我现在只有 7.4 方便测试。
<?php
class TplVarsPolyfill implements ArrayAccess
{
private $_smarty;
public function __construct(Smarty $smarty)
{
$this->_smarty = $smarty;
}
public function offsetSet($varName, $value)
{
$this->_smarty->assign($varName, $value);
}
public function offsetExists($offset)
{
$tplVars = $this->_smarty->getTemplateVars();
return isset($tplVars[$offset]);
}
public function offsetUnset($varName)
{
$this->_smarty->clearAssign($varName);
}
public function offsetGet($offset)
{
$tplVars = $this->_smarty->getTemplateVars();
return isset($tplVars[$offset]) ? $tplVars[$offset] : null;
}
/**
* This is required to convince Smarty to set the instance
* @see Smarty::__set
* @return mixed
*/
public function _tpl_vars()
{
return $this->_smarty->getTemplateVars();
}
}
$smarty = new Smarty();
$smarty->_tpl_vars = new TplVarsPolyfill($smarty);
$testVarName = 'foo';
$testVal = 'bar';
$smarty->assign($testVarName, $testVal);
assert($smarty->_tpl_vars[$testVarName]==$testVal, 'Value in polyfill should match what was assigned via assign()');
$polyfillVarName = 'animal';
$polyfillVal = 'wombat';
$smarty->_tpl_vars[$polyfillVarName] = $polyfillVal;
$smartyTemplateVars = $smarty->getTemplateVars();
assert($smartyTemplateVars[$polyfillVarName]==$polyfillVal, 'Value in getTemplateVars() should match what was assigned via polyfill');
通过在 PHP 5.2/Smarty 2
的 Smarty.class.php 中添加以下代码片段来管理解决方法function getTemplateVars($name=null)
{
return $this->_tpl_vars[$name];
}
我会将所有 $smarty->_tpl_vars[] 替换为 $smarty->getTemplateVars() 和这个确保向后兼容性的方法。