2017-01-11 5 views
0

Gerade erst begonnen OOP lernen und ich versuche, eine abstrakte Klasse durch ein Paket zu verlängern und das ist der Fehler Ich erhalte:PHP FatalErrorException - Erklärung ‚‘ müssen kompatibel sein mit ‚‘

Erklärung Clio :: getResourceOwnerDetailsUrl() muss mit Liga \ OAuth2 \ Client \ Provider kompatibel sein \ AbstractProvider :: getResourceOwnerDetailsUrl (Liga \ OAuth2 \ Client \ Token \ AccessToken $ Token)

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

der Ab strakte Klasse selbst ist lang aber Im Einfügen die abstrakte Methode, die ich in meiner erweiterten Klasse zu implementieren bin versucht:

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

Und hier ist das, was ich als meine Controller-Klasse:

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

Bitte lassen Sie mich wissen, was hier falsch ist. Durch die Art, wie ich dies in Laravel mache 5.3 PHP v5.6.25 läuft

+0

Haben Sie 'AccessToken' importiert? –

+1

@LordZed das muss es sein. Hab ich nicht. Mache ich hier nur "Gebrauch"? – user6890934

+0

Wenn Sie eine abstrakte Klasse erweitern, müssen Sie ** all ** der angegebenen abstrakten Funktionen definieren, und Ihre Deklarationen dieser Funktionen müssen mit den abstrakten Deklarationen kompatibel sein. –

Antwort

0

Wenn Sie die PHP-Dokumentation auf abstrakte Klassen lesen, heißt es eindeutig:

Wenn von einer abstrakten Klasse erbt alle Methoden markiert abstract in der Deklaration der Elternklasse muss vom Kind definiert werden; Außerdem müssen diese Methoden mit derselben (oder weniger eingeschränkten) Sichtbarkeit definiert werden. Wenn die abstrakte Methode beispielsweise als geschützt definiert ist, muss die Funktionsimplementierung entweder als geschützt oder öffentlich, aber nicht als privat definiert sein. Außerdem müssen die Signaturen der Methoden übereinstimmen, d. H. Die Typhinweise und die Anzahl der erforderlichen Argumente müssen übereinstimmen. Wenn die untergeordnete Klasse beispielsweise ein optionales Argument definiert, für das die Signatur der abstrakten Methode nicht gilt, besteht kein Konflikt in der Signatur. Dies gilt auch für Konstruktoren ab PHP 5.4. Vor 5.4 Konstruktorsignaturen können sich unterscheiden.

Wenn Sie die Klasse Liga \ OAuth2 \ Client \ Provider \ AbstractProvider erweitern möchten, müssen Sie alle diese Methoden in der erweiterten Klasse definieren:

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

Es sieht für mich wie Ihre Parameterdeklarationen stimmen nicht mit checkResponse und createResourceOwner überein.

+0

Korrekt. Ich habe auch AccessToken und ResponseInterface nicht importiert. Ich danke dir sehr. – user6890934