Les programmes orientés objet sont construits via une structure hiérarchique de classes. Dans les langages à héritage unique tels que PHP, l'héritage de classe ressemble à une arborescence. Une classe racine a une ou plusieurs sous-classes, puis une ou plusieurs sous-classes sont héritées de chaque sous-classe. . Plus de sous-catégories de niveau supérieur. Bien entendu, plusieurs classes racine peuvent être utilisées pour implémenter différentes fonctions. Dans une architecture bien conçue, chaque classe racine doit avoir une interface utile pouvant être utilisée par le code d’application. Si notre code d’application est conçu pour fonctionner avec la classe racine, il peut également fonctionner avec n’importe quelle sous-classe héritant de la classe racine.
Une méthode abstraite est comme un espace réservé pour une méthode régulière dans une sous-classe (elle prend de la place mais n'a aucun effet), mais contrairement à une méthode régulière, elle n'a pas de code. S’il existe une ou plusieurs méthodes abstraites dans une classe, alors la classe devient une classe abstraite. Vous ne pouvez pas instancier des classes abstraites. Vous devez en hériter, puis instancier des sous-classes. Vous pouvez également considérer les classes abstraites comme un modèle pour les sous-classes.
Si vous remplacez toutes les méthodes abstraites, la sous-classe devient une classe normale. Si toutes les méthodes ne sont pas remplacées, la sous-classe est toujours abstraite. Si une classe contient une méthode abstraite (même s'il n'y en a qu'une), vous devez déclarer la classe comme abstraite en ajoutant abstract avant le mot-clé class.
La syntaxe de déclaration d'une méthode abstraite est différente de celle de déclaration d'une méthode générale. La méthode abstraite n'a pas le corps principal entre accolades {} comme la méthode générale et se termine par un point-virgule ;.
Dans l'exemple 6.13, nous définissons une classe Shape qui contient une méthode getArea. Mais comme il est impossible de déterminer l'aire d'une figure sans connaître la forme, nous avons déclaré la méthode getArea comme méthode abstraite. Vous ne pouvez pas instancier un objet Shape, mais vous pouvez en hériter ou l'utiliser dans une expression, comme dans l'exemple 6.13.
Si vous créez une classe avec uniquement des méthodes abstraites, vous définissez une interface. Pour illustrer cette situation, PHP possède l'interface et implémente des mots-clés. Vous pouvez utiliser une interface au lieu de classes abstraites et implémenter au lieu d'étendre pour décrire la définition de votre classe ou utiliser une interface. Par exemple, vous pouvez écrire un myClass implémente myIterface. Vous pouvez choisir entre ces deux méthodes en fonction de vos préférences personnelles.
/*Note:
Les deux méthodes font référence à :
1. classe abstraite aaa{} (notez qu'il n'y a que des méthodes abstraites dans aaa, pas de méthodes générales)
la classe bbb étend aaa{} (remplace la méthode abstraite dans aaa dans bbb)
2. interface aaa{}
la classe bbb implémente aaa{} (remplace la méthode abstraite dans aaa dans bbb)
*/
Listing 6.13 Classes abstraites
//classe racine abstraite classe racine abstraite
Forme de classe abstraite
{
fonction abstraite getArea(); //Définir une méthode abstraite
}
//classe enfant abstraite sous-classe abstraite
classe abstraite Polygon étend la forme // Polygone
{
fonction abstraite getNumberOfSides();
}
// classe concrète classe d'entité classe triangle
la classe Triangle étend le polygone
{
base de données publique ;
public $height;
public function getArea() //Remplace la méthode de calcul de la surface{
return(($this->base * $this->height)/2);
}
fonction publique getNumberOfSides() //Remplacer la méthode de comptage latéral{
retour(3);
}
}
//quadrilatère de classe d'entité de classe concrète
la classe Rectangle étend le polygone
{
largeur $ publique ;
public $hauteur ;
fonction publique getArea()
{
return($this->width * $this->height);
}
fonction publique getNumberOfSides()
{
retour(4);
}
}
//cercle de classe d'entité de classe concrète
Le cercle de classe étend la forme
{
public $radius ;
fonction publique getArea()
{
return(pi() * $this->radius * $this->radius);
}
}
//la classe racine concrète définit une classe de couleur
classeCouleur
{
public $nom ;
}
$myCollection = array(); //Créez une collection de formes et placez-la dans un tableau
//créez un rectangle
$r = nouveau rectangle ;
$r->largeur = 5 ;
$r->hauteur = 7 ;
$maCollection[] = $r;
unset($r);
//crée un triangle
$t = nouveau Triangle ;
$t->base = 4 ;
$t->hauteur = 5 ;
$maCollection[] = $t;
unset($t);
//faire un cercle
$c = nouveau Cercle ;
$c->rayon = 3 ;
$maCollection[] = $c;
unset($c);
//crée une couleur
$c = nouvelle couleur ;
$c->nom = "bleu" ;
$maCollection[] = $c;
unset($c);
foreach($maCollection comme $s)
{
if($s instanceof Shape) //Si $s est une instance de la classe Shape{
print("Zone : " . $s->getArea() . "n");
}
if($s instance de Polygone)
{
print("Côtés : " .$s->getNumberOfSides()."n");
}
if($s instance de couleur)
{
print("Couleur : $s->nom n");
}
print("n");
}
?>