覆盖赋值方法

时间:2015-02-24 10:52:45

标签: php oop templates override smarty

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

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

这里有什么问题?

2 个答案:

答案 0 :(得分:0)

因为您使用了相同的方法名称,所以您将覆盖父方法。在这种情况下,您需要自己遵循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);
}

旁注:

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

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

答案 1 :(得分:0)

Smartie基类已经有一个带有默认值的多参数“assign”函数。你不需要你的两个参数赋值函数,因为它被归类为“阴影”而没有正确覆盖。如果需要覆盖,则应使签名相同。

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

否则,你调用(多态/继承样式),

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

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

鉴于你的函数是一个带有默认值的直通,除非你修剪了一些业务逻辑,否则该函数几乎是多余的。