覆盖分配方法

Overriding assign method

我正在尝试覆盖 smarty 对象的分配方法,然后调用父对象。

class View extends Smarty
{
   public function __construct()
   {
     parent::__construct();
   }

    public function assign($name, $value)
    {
     // some code that manipulate the values of $name and $value
     // .......

     parent::assign($name, $value, false);
    }

}

$tpl = new View();
$tpl->assign('name', 'index.tpl');

此时我得到

Strict standards: Declaration of View::assign() should be compatible with Smarty_Internal_Data::assign($tpl_var, $value = NULL, $nocache = false) in /Users/me/Projects/smarty/View.php on line 6

这里有什么问题?

因为您使用了相同的方法名称,所以您覆盖了父方法。在这种情况下,您需要自己遵循 Smarty 的 assign() 参数(就像使用界面一样)。

试试这个:

public function assign($name, $value = null, $nocache = false)
{
 // some code that manipulate the values of $name and $value
 // .......

 parent::assign($name, $value, $nocache);
}

旁注:

初始化子对象class时,不需要调用父对象的构造函数。所以你可以摆脱这段代码,因为它是完全无用的:

public function __construct()
{
    parent::__construct();
}

Smartie base class 已有多参数 "assign" 功能,默认值。你不需要你的两个参数赋值函数,因为它在没有正确覆盖的情况下被 classed 为 "shadowing"。如需重写,请将签名设为相同。

public function assign($tpl_var, $value = NULL, $nocache = false)

否则,您调用 (polymorphic/inheritance stylee),

myobj.assign("bob", "myvalue")

它不知道调用哪个函数,因为您使用默认参数隐藏了相同的函数。

鉴于您的函数是使用默认值的直接直通,除非您删除了一些业务逻辑,否则该函数几乎是多余的。