PHP FatalErrorException - 声明' '必须与'兼容'

时间:2017-01-11 23:48:45

标签: php laravel oop abstract-class

刚开始学习OOP,我试图扩展一个包提供的抽象类,这是我得到的错误:

  

Clio :: getResourceOwnerDetailsUrl()声明必须与League \ OAuth2 \ Client \ Provider \ AbstractProvider :: getResourceOwnerDetailsUrl(League \ OAuth2 \ Client \ Token \ AccessToken $ token)兼容

Here is the documentation I'm following for that package here

抽象类本身很长,但是我在我的扩展类中试图实现抽象方法:

/**
 * Returns the URL for requesting the resource owner's details.
 *
 * @param AccessToken $token
 * @return string
 */
abstract public function getResourceOwnerDetailsUrl(AccessToken $token);

而且,这是我的控制器类:

class Clix extends League\OAuth2\Client\Provider\AbstractProvider{

public function getBaseAuthorizationUrl(){}
public function getBaseAccessTokenUrl(array $params){}
public function getResourceOwnerDetailsUrl(AccessToken $token){}
protected function getDefaultScopes(){}
protected function checkResponse($response, $data){}
protected function createResourceOwner(array $response, $token){}}

请告诉我这里有什么问题。顺便说一句,我在Laravel 5.3中运行PHP v5.6.25

1 个答案:

答案 0 :(得分:0)

如果您阅读关于抽象类的PHP文档,它会明确指出:

  

从抽象类继承时,父类声明中标记为abstract的所有方法都必须由子类定义;此外,必须使用相同(或限制较少)的可见性来定义这些方法。例如,如果将抽象方法定义为protected,则必须将函数实现定义为protected或public,而不是private。此外,方法的签名必须匹配,即类型提示和所需参数的数量必须相同。例如,如果子类定义了一个可选参数,而抽象方法的签名没有,则签名中不存在冲突。这也适用于PHP 5.4的构造函数。在5.4构造函数签名可能不同之前。

如果要扩展类 League \ OAuth2 \ Client \ Provider \ AbstractProvider ,则必须在扩展类中定义所有这些方法:

abstract public function getBaseAuthorizationUrl();
abstract public function getBaseAccessTokenUrl(array $params);
abstract public function getResourceOwnerDetailsUrl(AccessToken $token);
abstract protected function getDefaultScopes();
abstract protected function checkResponse(ResponseInterface $response, $data);
abstract protected function createResourceOwner(array $response, AccessToken $token);

在我看来,你的参数声明与checkResponse和createResourceOwner不匹配。