Modèle objet de PHP (1)
Notes de cours
Travail personnel
Objectifs
On continue à manipuler PHP et on aborde les aspects objets.
Exercice 1 — PHP Objet : Géométrie : polygone, rectangle, triangle, ... #
Le but de ce tp est d'illustrer en PHP l'héritage sur un exemple classique de géometrie; les polygones et leurs specialisation en rectangles, en triangles etc.... Un polygones est caracterisé par des points.
- Écrire dans un fichier "Point.php" une classe
Point
pour representer un point avec une couleur donnée en 2 dimensions. Elle comprendra au moins le constructeur ainsi qu'une méthodedistance
pour calculer la distance d'un point à un autre et une méthodetoString
pour pouvoir afficher les coordonnées d'un point sous la forme (x,y). - Ecrire dans un fichier "Polygone.php" une classe
Polygone
où un polygome est un ensemble de points : Soit le constructeur qui prend en arguments les points qui composent le polygone.- Écrire la méthode
nbrSommet
pour calculer le nombre de sommets. - Écrire la méthode
perimetre
pour calculer le périmètre. - Ajouter une méthode
__toString
pour l'affichage de la liste des sommets (les points). - Écrire un fichier "testPolynome.php" pour tester vos polygones et leurs methodes.
Par exemple :
$Polygone= new Polygone(new Point(10,10), new Point(20,20),new Point(10,20));
print("Je suis un polygone avec les sommets : ".$Polygone);
print("et de perimetre ".$Polygone->Perimetre());
...
- Écrire la méthode
- Écrire dans un fichier "Rectangle.php" une classe
Rectangle
qui spécialise les polygones. Le constructeur prend deux points en argument correspondants aux coins supérieur gauche et inférieur droit).- Ajouter des méthodes
longueur
etlargeur
pour calculer la longueur et la largeur. - Ajouter une méthode
perimetre
pour calculer le périmètre du rectangle.
- Ajouter des méthodes
- Ecrire une classe
Traiangle
qui hérite de la classe Polygone.- Écrire une méthode
equilateral
qui vérifie si un triangle est équilatéral ou non
- Écrire une méthode
- Écrire dans un fichier "Cercle.php" une classe
Cercle
qui est caractérisé par son centre (c.à.d. un point) et son rayon. Cette classe comprendra le(s)) constructeur(s), une méthodePerimetre
pour calculer le périmètre du cercle ainsi qu'une méthodeSurface
pour calculer sa surface. - A la création d'une instance de cercle, il faut vérifier que la valeur de son rayon est positive. Dans le cas contraire, le programme lève une exceptionon et retourne un message d'erreur.
- Créer une méthode d'affichage d'un cercle .
- Le rayon d'un cercle est défini comme la distance entre les points du cercle et son centre.
Un cercle est l'ensemble des points situés à même distance d'un point donné. Ce point est son centre,
la distance est le rayon. On peut traduire ceci est disant qu'un cercle est l'ensemble des solutions d'une équation
de la forme :
`\sqrt((x-a)^2 + (y-b)^2) = R`pour R un nombre réel positif (cercle de centre (a,b) et rayon R). Un cercle peut être construit soit à partir de son centre et de son rayon, soit à partir de deux points (centre et un autre point) diamétralement opposés. Un cercle possède un périmètre et une surface. Il peut être affiché, translaté. Il est possible de modifier sa couleur, son rayon et son diamètre. Compléter la classe Cercle (précédente).
Remarque :
On peut utiliser l'autoloading dans les fichier de test.Améilioration :
On peut améliorer l'affichage d'une figure géométrique sur une page web, en utilisant la bibliothèqueGD
dont voici un exemple : // Création d'une image vide $image = imagecreatetruecolor(400, 300) or die('Cannot Initialize new GD image stream');; // Alloue une couleur pour le polygone $col_poly = imagecolorallocate($image, 255, 255, 255); // Dessine le polygone imagepolygon($image, array( 0, 0, 100, 200, 300, 200 ), 3, $col_poly); // Affichage de l'image sur le navigateur header('Content-type: image/png'); imagepng($image); $save='test1.png'; imagepng($image,$save,0,NULL); imagedestroy($image);
header("Content-type: image/png"); $img_width = 800; $img_height = 600; $img = imagecreatetruecolor($img_width, $img_height); $black = imagecolorallocate($img, 0, 0, 0); $white = imagecolorallocate($img, 255, 255, 255); $red = imagecolorallocate($img, 255, 0, 0); $green = imagecolorallocate($img, 0, 255, 0); $blue = imagecolorallocate($img, 0, 0, 255); $orange = imagecolorallocate($img, 255, 200, 0); imagefill($img, 0, 0, $white); imagerectangle($img, $img_width*2/10, $img_height*5/10, $img_width*4/10, $img_height*8/10, $red); imagerectangle($img, $img_width*4/10, $img_height*5/10, $img_width*8/10, $img_height*8/10, $red); imagepolygon($img, [$img_width*3/10, $img_height*2/10, $img_width*2/10, $img_height*5/10, $img_width*4/10, $img_height*5/10], 3, $red); imagepolygon($img, [$img_width*3/10, $img_height*2/10, $img_width*7/10, $img_height*2/10, $img_width*8/10, $img_height*5/10,$img_width*4/10, $img_height*5/10], 4, $red); imageellipse($img, 100, 100, 100, 100, $orange); imagearc($img, $img_width*3/10, $img_height*8/10, 100, 200, 180, 360, $red); imageline($img, 0, $img_height*8/10, $img_width, $img_height*8/10, $green); imagepng($img); $save='test2.png'; imagepng($img,$save,0,NULL);