2010-10-29 4 views
1

J'ai un problème pour étendre une classe qui elle-même étend une classe abstraite.Problème avec l'extension d'une classe

La classe abstraite de base a les méthodes suivantes:

Résumé:

private final __construct() 
abstract protected function loadFromId() 
private static final load($id) 

classe 1 se prolonge Résumé:

protected loadFromId() 

classe 2 étend la classe 1:

//nothing as of yet 

La raison pour laquelle j'étend la classe 1 à partir de la classe 2 est que j'en ai besoin pour renvoyer une instance de la classe 1. La classe 2 retournera fondamentalement un objet nul à des fins de validation.

Si je tente d'étendre la classe 1:

Class 2 extends Class 1 { } 

Je reçois l'erreur suivante « Cannot override final method class::__construct() », évidemment parce qu'elle est une méthode privée.

Y at-il un moyen que je peux créer un objet nul basé sur la classe 1?

+1

Vous ne pouvez obtenir que 'Impossible de surcharger la méthode finale class :: __ construct() 'si vous avez réellement placé un autre constructeur dans une des sous-classes (qui ne peut évidemment pas fonctionner à cause du mot clé [final'] (http: // .php.net/manual/fr/language.oop5.final.php)). Sinon, vous devriez obtenir une erreur fatale: appel à private A :: __ construct() à partir d'un contexte invalide. – Gordon

Répondre

3

L'erreur que vous recevez est provoquée par le fait que vous avez déclaré votre fonction construct() dans la super classe abstraite comme finale, ce qui signifie que vous ne pouvez pas la surcharger. Retirez-le et il ne devrait pas y avoir de problème.

Sur une note: il est plus sûr d'utiliser protégé lors de l'utilisation de l'héritage. Sauf si vous êtes absolument sûr que vous n'aurez pas besoin du champ/de la fonction dans vos classes enfants.

+0

Merci pour votre contribution. Nous avons modifié la fonction de construction abstraite afin qu'elle accepte un identifiant nul. Si un ID $ null est trouvé, nous déterminons la classe appelante en utilisant get_called_class, que nous pouvons ensuite affecter à '_Null' afin d'instancier l'objet nul. –