Interface
Introduction à la programmation orientée objet en PHP
Interface
Les interfaces vont avoir un but similaire aux classes abstraites puisque l'un des intérêts principaux liés à la définition d'une interface va être de fournir un plan général pour les développeurs qui vont implémenter l'interface et de les forcer à suivre le plan donné par l'interface.
Les deux différences majeures entre les interfaces et les classes abstraites sont :
1. Une interface ne peut contenir que les signatures des méthodes (c'est-à-dire le nom et les paramètres) ainsi qu'éventuellement des constantes mais pas de propriétés. Cela est dû au fait qu'aucune implémentation n'est faite dans une interface : une interface n'est véritablement qu'un plan ;
2. Une classe ne peut pas étendre plusieurs autres classes à cause des problèmes d'héritage. En revanche, une classe peut tout à fait implémenter plusieurs interfaces.
Le problème du diamant
Pourquoi une classe n'a pas l'autorisation d'étendre plusieurs autres classes? Pour cela, imaginons qu'on ait une première classe A qui définit la signature d'une méthode diamond() sans l'implémenter. Nous créons ensuite deux classes B et C qui étendent la classe A et qui implémentent chacune d'une manière différente la méthode diamond(). Finalement, on crée une classe D qui étend les classes B et C et qui ne redéfinit pas la méthode diamond(). Dans ce cas-là, on est face au problème suivant : la classe D doit-elle utiliser l'implémentation de diamond() faite par la classe B ou celle faite par la classe C ?
Le fichier classes/utilisateur.interface.php<?php
interface Utilisateur{
public const ABONNEMENT = 15;
public function getNom();
public function setPrixAbo();
public function getPrixAbo();
}
On va ensuite pouvoir réutiliser les définitions de notre interface dans des classes. Pour cela, on va implémenter notre interface. On va pouvoir faire cela de la même manière que lors de la création de classes étendues mais on va cette fois-ci utiliser le mot clef implements à la place de extends
Le fichier classes/admin.class.php<?php
class Admin implements Utilisateur {
protected $user_name;
protected $user_region;
protected $prix_abo;
protected $user_pass;
protected static $ban;
public function __construct($n, $p, $r) {
$this->user_name = strtoupper($n);
$this->user_pass = $p;
$this->user_region = $r;
}
public function getNom() {
echo $this->user_name;
}
public function getPrixAbo() {
echo $this->prix_abo;
}
public function setBan(...$b) {
foreach($b as $banned){
self::$ban[] .= $banned;
}
}
public function getBan() {
echo 'Utilisateurs bannis : ';
foreach(self::$ban as $valeur) {
echo $valeur .', ';
}
}
public function setPrixAbo() {
if($this->user_region === 'Sud'){
// parent est remplacé par le nom de l'interface
return $this->prix_abo = Utilisateur::ABONNEMENT / 6;
} else {
// parent est remplacé par le nom de l'interface
return $this->prix_abo = Utilisateur::ABONNEMENT / 3;
}
}
}