覆盖分配方法
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")
它不知道调用哪个函数,因为您使用默认参数隐藏了相同的函数。
鉴于您的函数是使用默认值的直接直通,除非您删除了一些业务逻辑,否则该函数几乎是多余的。
我正在尝试覆盖 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")
它不知道调用哪个函数,因为您使用默认参数隐藏了相同的函数。
鉴于您的函数是使用默认值的直接直通,除非您删除了一些业务逻辑,否则该函数几乎是多余的。