Typage
Nous avons vu que les fonctions ne précisaient pas de type pour leurs arguments. C'est aussi le cas des méthodes de fonctions mais il est possible de spécifier explicitement le type d'objet attendu pour un paramètre. Il suffit de préfixer son nom par le nom de la classe attendue.
<?php class Voiture { function depasser(Voiture $v) { $this->vitesse = $v->vitesse + 20; } } ?>
Classe abstraite
Une classe abstraite permet de définir des méthodes et des attributs par les classes filles. Elle ne peut être instanciée.
Par exemple notre Vehicule a pour attribut un nombre de place mais il n'est pas souhaitable qu'il soit instancié. Il s'agit du concept de véhicule mais il n'a pas d'existence propre seule une classe fille, Voiture par exemple, a une légitimité à être instanciée.
On utilisera le mot clé abstract
pour les classes et les méthodes à implanter.
<?php abstract class Vehicule { abstract function rendreVisible(); } class Voiture extends Vehicule { private $phares; function rendreVisible() { $this->phares = TRUE; } } ?>
Toute tentative d'instanciation de Vehicule provoquera une erreur.
Si une classe fille n'implante pas une ou plusieurs méthodes abstraites, ces méthodes devront elles aussi être déclarées abstraites.
Interface
Une interface permet de définir des comportements communs aux classes qui les implantent. On utilisera le mot
clé interface
.
<?php interface Auditorium { public function jouerMusique(); } ?> class Voiture implements Auditorium { function jouerMusique() { echo "Keep you in the dark, You know they all pretend"; } } ?>
Une classe peut implanter plusieurs interfaces.
Une interface ne contient aucune implantation.
Une classe doit implanter toutes les méthodes des interfaces.
Une des utilisations des interface est l'API qui permet de lister les méthodes nécessaire à l'utilisation sans préjuger de l'implantation. Par exemple, une interface pourait définir les noms de méthodes de recherche dans une source de données. Les développeurs pourront implanter des interfaces spécifiques à leurs besoins. On pourra ainsi utiliser de manière transparente une base de données, un annuaire LDAP ou un fichier plat.
Classes et méthodes finales
final
interdit l'héritage et la surcharge (redéfinition).
Classe
<?php final class Voiture extends Vehicule { function avancer() { // Intructions } } ?>Il ne peut y avoir de classe héritant de Voiture.
Méthode
<?php class Voiture extends Vehicule { final function avancer() { // Intructions } } ?>Il n'est pas possible de surcharger la méthode avancer.