2017-01-11 31 views
0

だけでOOPを習い始めて、私はパッケージで提供抽象クラスを拡張しようとしている、これは私が取得していますエラーです:PHP FatalErrorException - 「の宣言は」「と互換性がなければならない」

クリオの宣言:: getResourceOwnerDetailsUrl()リーグ\のOAuth2 \クライアント\プロバイダとの互換性が必要\ AbstractProvider :: getResourceOwnerDetailsUrl(リーグ\のOAuth2 \クライアント\トークン\ AccessToken $トークン)

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); 

そして、::stractクラス自体は長いものですが、イムは、私は私の拡張クラスで実装しようとしている抽象メソッドを貼り付ける

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){}} 

ここで間違っていることを教えてください。私はあなたが抽象クラス上のPHPのドキュメントを読めば、PHPのv5.6.25

+0

あなたは 'AccessToken'をインポートしましたか? –

+1

@ LordZedでなければなりません。私はしませんでした。私はここで「使用」するだけですか? – user6890934

+0

抽象クラスを拡張するときは、それが指定する抽象関数の** all **を定義する必要があり、それらの関数の宣言は抽象宣言と互換性がなければなりません。 –

答えて

0

を実行しているLaravel 5.3でこれをやっているところで、それは明確に述べている:

抽象クラスから継承し、すべてのメソッドをマーク親のクラス宣言の抽象は、子によって定義されていなければなりません。さらに、これらのメソッドは、同じ(または制限の少ない)可視性で定義する必要があります。たとえば、抽象メソッドがprotectedとして定義されている場合、関数の実装はprotectedまたはpublicとして定義する必要がありますが、privateとして定義する必要はありません。さらに、メソッドのシグネチャが一致しなければならない。すなわち、タイプヒントと必要な引数の数が同じでなければならない。たとえば、子クラスが省略可能な引数を定義していて、抽象メソッドのシグネチャがそうでない場合、シグネチャに競合はありません。これはPHP 5.4以降のコンストラクタにも当てはまります。 5.4コンストラクタシグネチャが異なる可能性があります。

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); 

それはのように私には見えます:あなたはリーグ\のOAuth2 \クライアント\プロバイダ\ AbstractProviderは、あなたがあなたの拡張クラスでこれらのメソッドをすべて定義する必要があり、クラスを拡張したい場合は

パラメータの宣言がcheckResponseとcreateResourceOwnerで一致しません。

+0

正しい。私はまた、AccessTokenとResponseInterfaceをインポートしませんでした。どうもありがとうございます。 – user6890934

関連する問題