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() 和这个确保向后兼容性的方法。