Я пытаюсь переопределить метод assign объекта 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’s 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();
}
Базовый класс Smartie уже имеет функцию «назначить» с несколькими параметрами со значениями по умолчанию. Вам не нужна функция назначения с двумя параметрами, поскольку она классифицируется как «затенение» без надлежащего переопределения. Если вам нужно переопределить, вы должны сделать подписи одинаковыми.
public function assign($tpl_var, $value = NULL, $nocache = false)
в противном случае вы звоните (полиморфный / наследование стиля),
myobj.assign("bob", "myvalue")
он не знает, какую из них вызывать, поскольку вы замаскировали ту же функцию с параметром по умолчанию.
Учитывая, что ваша функция является прямым проходом со значением по умолчанию, если вы не обрезали какую-то бизнес-логику, функция в значительной степени избыточна.