PHP 方法重寫,引數不同,報錯: Declaration

kuibatian發表於2019-12-19

php 方法重寫,引數不同,報錯: Declaration of should be compatible with that

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控制器。

php 方法重寫,引數不同,報錯: Declaration of should be compatible with that

這邊 一個方法 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方法時為新加入的引數指定一個預設值即可。

相關文章