php 方法重寫,引數不同,報錯: Declaration of should be compatible with that
這裡是ErrorException: Declaration of Module\Article\Controller\Mobile\ListController::tagsVideo($type, $tagsStr) should be compatible with Module\Article\Controller\Web\ListController::tagsVideo($type, $tagsStr, $page = NULL)
因為我這裡是繼承的關係,這是手機端的控制器繼承PC控制器。
這邊 一個方法 tagsVideo()
是被重寫的方法,但是一直報錯,查詢了一下,原來是 php 繼承 重寫 函式,則引數不一致問題。
// MOBILE
public function tagsVideoFalls($tagsStr,$maxId=null)
{
// 加上簡單的驗證
if (!empty($maxId)) {
$maxId = intval($maxId);
}else{
$maxId = intval($this->getParamsMaxId());
}
$articles = $this->relations($this->parseTags($tagsStr), 10, [Article::CATEGORY_VIDEO], $maxId);
return $this->renderApi($this->articleAddLink($articles));
}
//PC
public function tagsVideo($type, $tagsStr,$page=null)
{
$tags = $this->parseTags($tagsStr);
$count = 10;
// 加上 $page
$articles = $this->paging($this->relations($tags, $count*10, Article::CATEGORY_VIDEO), $count, $page);
$urlPattern = $this->linkFactory->videoTag($type, $tags);
return $this->render("articles", $urlPattern, [
"tagName" => $tagsStr,
"articles" => $articles,
"matchType" => $type,
"tdk" => [
"topic" => $this->findTdkTags($tagsStr),
]
]);
}
明顯看到,是有一個page 引數,我們可以給一個預設為空即可。
報錯提示
<?php
abstract class A {
// 方法無引數
public static function foo(){ echo 'bar'; }
}
abstract class B extends A {
// 方法有引數
public static function foo($str){ echo $str; }
}
?>
如上面的程式碼:類A中的foo方法無引數,類B在繼承A後重寫foo方法時加入了引數,因此會產生一個類似下面E_STRICT級別的警告:
Strict standards: Declaration of ... should be compatible with that of ...
解決方法:
<?php
abstract class A {
// 方法無引數
public static function foo(){ echo 'bar'; }
}
abstract class B extends A {
// 方法有引數
public static function foo($str = NULL){ echo $str; }
}
?>
解決辦法
類B在重寫foo方法時為新加入的引數指定一個預設值即可。