您收到此错误是因为自定义(覆盖)方法的“签名”与原始方法不同。
覆盖方法时,请确保它与原始方法保持兼容。
想象一下这个例子;
public function serveSandwich($person, $sandwich, $drink = null)
{
find($person);
serve($person, $sandwich);
if ($drink) {
serve($person, $drink);
}
}
这很好用,这种方法允许您为某人提供三明治和(可选)饮料,例如:
serveSandwich('motherinlaw', 'peanut butter', 'orange juice');
但是,此功能不符合您的要求,您想在上三明治前先让座。
所以你决定用你的高级方法覆盖该方法;
public function serveSandwich($person, $furniture, $sandwich, $drink = null)
{
find($person);
havePersonSitOn($person, $furniture);
serve($person, $sandwich);
if ($drink) {
serve($person, $drink);
}
}
对于您的下一次聚会,您聘请 Jeeves,他有资格使用 CakePHP 2.3 提供三明治。
你让 Jeeves 给你岳母端上一份花生酱三明治;他知道如何在 CakePHP 中做到这一点,所以会发生这种情况:
serveSandwich('motherinlaw', 'peanut butter', 'orange juice');
但是,Jeeves 不知道不兼容的覆盖,因此您的岳母最终会坐在花生酱三明治上,手里拿着橙汁!
如何正确执行此操作
基本上,您可以选择两种方法;
创建一个调用原始方法的新方法
public function seatAndServeSandwich($person, $furniture, $sandwich, $drink = null)
{
havePersonSitOn($person, $furniture);
$this->serveSandwich($person, $sandwich, $drink = null)
}
这是首选方式;为了使用高级功能,您显式调用新方法,而新方法又调用原始方法
在你的情况下:
public function customflash($message, $url, $pause = 1, $progressIs, $layout = 'flash') {
$this->set('progress_is', $progressIs);
return $this->flash($message, $url, $pause, $layout);
}
在末尾追加新参数
这也可以,但是如果以后的 CakePHP 版本会为方法添加新参数,可能会flash
导致问题;
public function flash($message, $url, $pause = 1, $layout = 'flash', $progressIs = null) {
$this->set('progress_is', $progressIs);
return parent::flash($message, $url, $pause, $layout);
}
额外的参数永远不会被其他控制器使用,因为他们不知道它存在,因此不会造成任何问题(只要它不是必需的参数)。