Skip to content

L’Abstraction en PHP5

Ce concept suit l’héritage, elle permet d’obliger des méthodes à être disponible dans les classes filles. Les classes abstraites ne peuvent être instanciées.

Classe abstraite

Une classe dite abstraite ne peut être instanciée, elle doit être dérivée pour pouvoir être utilisée. Elles permettent de spécifier les membres que devront obligatoirement posseder les classes dérivées

Méthode abstraite

Une méthode abstraite est similaire à une classe abstraite mais restreint à la méthode. Une classe abstraite contenant une méthode abstraite devient elle meme abstraite. Elles devront être obligatoirement vides afin d’obliger les filles à surdéfinir ses méthodes. Si ces dernieres ne le sont pas, PHP retournera une erreur

Syntaxe

Pour définir une méthode ou classe abstraite, on utilisera le mot clé abstract

abstract class nomClass
{
		abstract [public] function nomMethode([...]);
}

Lorsqu’une fille surdéfinie une méthode, elle ne peut rendre la visibilité que public

L’opposition à abstract

Pour empecher la classe d’etre dérivée, on utilisera final qui peut également se placer devant les méthodes.

final class nomClass
{
		final [public|private] function nomMethode([...]);
}

Notes

Quels type d’erreur j’obtient lorsque j’instancie une classe abstract?

Fatal error: Cannot instantiate abstract class foo

Quels type d’erreur j’obtient si je ne surdéfinie pas une methode abstraite d’une classe non abstraite?

Fatal error: Class baz contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (foo::bar)

Que se passe t’il lorsque je définit une méthode private/protected sur une abstract?

Fatal error: Abstract function foo::bar() cannot be declared private

Pas d’erreur pour protected

Que se passe t’il si je tente de surdéfinir une methode final?

Fatal error: Non-abstract method baz::foobar() must contain body

Puis-je mélanger une classe abstraite et des méthodes final?

Rien

Puis-je mélanger une classe final et des méthodes abstraite?

Fatal error: Class foo contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (foo::bar)