抽象中的错误应与之兼容

时间:2015-06-03 08:22:44

标签: php laravel

我有类似这样的抽象类

int

和扩展类如

protected function update(Request $request, $id)
{
    //function body
}

从请求

扩展注入protected function update(PageRequest $request, $id) { //function body }
PageRequest

我收到此错误

  

App \ Http \ Controllers \ PagesController :: update()的声明应该   兼容   应用程序\ HTTP \控制器\ MasterController \ CrudController ::更新程序(App \ HTTP \请求\请求   $ request,$ id)

我知道传递所有参数并访问update()方法相同,我想我是正确的。

2 个答案:

答案 0 :(得分:4)

正确的方法:

class Request implements RequestInterface
class PageRequest extends Request

功能:

protected function update(RequestInterface $request, $id)

答案 1 :(得分:1)

最佳解决方案是使用界面,如this answer中所述。

另一个解决方案是在子类中声明方法update()而不更改其签名,并在代码中验证参数的类型是否正确。

这样的事情:

protected function update(Request $request, $id)
{
    if (! $request instanceof PageRequest) {
        throw new \InvalidArgumentException('Unexpected type ('.get_class($request).') of argument $request. Expecting an object of type PageRequest.');
    }

    // Do whatever you need to do with $request here
    // It is an object of type PageRequest
}

此解决方案在某些上下文中有其自身的优势,但它使代码更加冗长,并添加了额外的代码来运行。