| | Leçon de PHP n°2 : Les classes - niveau débutant | |
| | Auteur | Message |
---|
neiluj Parasite
Nombre de messages : 309 Age : 42 Planète : Neptune Matos : MacBook Air, MacBook Pro Unibody, iMac Alu, MacBook Black, Sanyo Z5 Date d'inscription : 18/09/2007
| Sujet: Leçon de PHP n°2 : Les classes - niveau débutant 3/27/2008, 23:11 | |
| Chapitre 1 : Les objets, c'est la classe.Nous voici arrivés à un point fondamental dans l'apprentissage du PHP, et d'une manière générale, de tous les langages de programmations orientés objet : les objets donc. Mais qu'est-ce qu'un objet? Un objet est en fait l'instance d'une classe, une classe est une structure d'objet. Ainsi lorsqu'on développe avec des objets, on commence par écrire les classes, et ensuite on instancie pour créer nos objets. Cela peut paraître assez abstrait pour l'instant mais nous allons voir un petit exemple simple et répandu. Chapitre 2 : En voiture, les enfants !Prenons comme exemple les véhicules, nous désirons créer la classe "véhicule", cette classe a comme propriété de pouvoir se déplacer. Il existe une multitude de véhicules, de tout genres. Ainsi la voiture et le vélo ont cela en commun qu'ils servent tous les deux à se déplacer. Nous pouvons dire que la classe "voiture" hérite de la classe "véhicule", tout comme la classe "vélo". Mais si on les compare à un bateau, qui est également un véhicule, on note une différence : le bateau n'a pas de roue. Il s'agit donc d'un autre type de véhicule. On distinguera donc deux classes : les véhicules roulants et les autres. Je ne vais pas aborder le cas de l'avion qui possède des roues pour se déplacer au sol mais utilise ses ailes la plupart du temps... On se limitera au cas des véhicules roulants. Reprenons, la classe "véhicule" possède deux " enfants" (qui hérite du " parent") : "véhicule roulant" et "autre". Les classes "voiture" et "vélo" sont également des enfants de "véhicule roulant" et partage donc une propriété de ce parent : avoir des roues. Plus précisément la classe voiture aura comme propriété d'en avoir 4 et le vélo 2. Si l'on s'attarde plus particulièrement sur la voiture, on sait qu'elle possède un volant, un moteur, des portes, un coffre, la majorité du temps ce que ne possède pas un vélo vu qu'il est muni d'un guidon, d'une selle, éventuellement d'un porte-bagage. Nous pouvons donc définir ces propriétés pour la classe "voiture" qui sont : les chevaux du moteur, sa consommation, son type (essence/diesel/electrique), le nombre de portes, la dimension du coffre, la boîte de vitesse (auto/manuel) sans oublier les dimensions de la voiture et tous ces détails qu'on connaît en regardant Turbo. En étant un peu plus précis on pourra apporter une propriété supplémentaire qui sera le genre de voiture : citadine, routière, berline, monospace, etc... Toutes ces propriétés définissent les classes, mais également les propriétés des parents de la classe si elle en possède. Maintenant nous allons être plus concret encore : j'ai acheté une Twingo (c'est un exemple hein, j'ai pas le permis...). La Twingo est un objet réel, je peux la voir, la toucher et même l'utiliser. Mais avant cela je sais que la Twingo est une voiture donc par définition : elle possède des roues, 4 comme toutes les voitures, elle possède un moteur, des portes, un coffre (pas de troll svp). Mais comme ce modèle est unique par rapport à toutes les voitures, elle possèdera des propriétés qui lui sont propres. Elle possède les mêmes propriétés que n'importe quelle voiture, mais les valeurs de ses propriétés lui appartiennent. Ainsi la Twingo est un objet : une instance de la classe "voiture". C'est également le cas de toutes les voitures, elles sont toutes des enfants de la classe "voiture". Vous savez désormais distinguer la notion de classe de la notion d'objet, c'est essentiel. Mais nous avons oublié une chose importante : les voitures ne font pas qu'avoir des moteurs et des portes, elles peuvent également se déplacer ! Et pas seulement, elle peut faire pas mal d'actions. Ces actions, c'est ce que nous appelons les méthodes. Les propriétés et les méthodes sont les deux composantes fondamentales des objets et des classes. Concrètement une méthode est en fait une fonction mais qui appartient à une classe, elle s'applique dans le contexte de la classe et nulle part ailleurs. Ainsi nous savons que la voiture peut se déplacer, nous allons donc avoir une méthode deplacer(). Mais cette méthode ne pourra pas s'appliquer ailleurs que dans la classe car cette méthode a besoin de savoir de quoi nous parlons : d'un véhicule, qui roule, qui possède un moteur, et non d'un homme, qui marche, qui a des jambes. Ce qui sous-entend qu'une méthode va se baser sur les propriétés de la classe, ce n'est pas nécessairement le cas mais la plupart du temps, c'est dans son intérêt et dans sa nature. Si on veut déplacer une voiture, il est important qu'elle soit en marche, il faut donc la démarrer. Là aussi nous avons affaire à une propriété (on parle également d'attribut, d'état ou de membres, moi je préfère dire propriété) et à une méthode. De cette manière la méthode deplacer() va vérifier la propriété "en marche", si elle est vérifiée on pourra se déplacer, sinon il faudra appeler la méthode demarrer() auparavant. Se déplacer c'est bien gentil mais faut-il encore savoir dans quel sens et à quelle vitesse, là encore la méthode deplacer() utilisera la propriété "vitesse" pour savoir si il s'agit d'une marche arrière, d'une marchant avant, de la 1ère, de la 2de, etc... De cette manière elle saura dans quel sens aller et avec quelle accélération. Voilà pour la théorie et le contexte de l'exemple qui va suivre, passons maintenant à la pratique et à la syntaxe. Chapitre 3 : Pour de vrai - Code:
-
<?php // voici comme nous créons une classe, notez les accolades class Vehicule { // nous n'avons pas besoin de définir beaucoup de choses sur le véhicule, on sait juste qu'il sert à se déplacer (je simplifie) function deplacer() { return true; } } // voici comment nous créons un héritage en PHP, le mot clé "extends" sert à étendre les propriétés et les méthodes du parent à l'enfant class VehiculeRoulant extends Vehicule { // On en sait pas beaucoup plus sur le véhicule roulant, à part qu'il a des roues. // Je définis donc la propriété roues, même si elle n'a pas de valeur, elle existe. var $roues = 4; } class Voiture extends VehiculeRoulant { // Nous savons que la voiture a plus de propriétés, nous allons donc les déclarer. var $modele; // entier indiquant le nom du var $demarre; // booléen indiquant si la voiture est en marche ou non var $vitesse; // entier indiquant la vitesse actuelle, -1 pour marche arrière, 0 pour point mort, 1 pour la 1ère, etc... var $type_moteur; // chaine indiquant le type de moteur : essence, diesel , gpl ou électrique var $type_boite; // chaine indiquant le type de boîte de vitesse : manuel ou automatique var $nb_vitesse; // entier indiquant le nombre de vitesse sur la boite var $conso_moteur; // entier indiquant la consommation du moteur en L/100km ou kW/100km var $nb_portes; // entier indiquant le nombre de portes de la voiture var $volume_coffre; // le volume du coffre en L // on pourrait en mettre plein d'autres, ce n'est pas le but ici. // Mais si nous voulons nous amuser un peu, nous allons penser notre voiture dans un espace en 2D... var $x; // abscisse var $y; // ordonnée var $direction; // direction en ° trigo var $vecteur_vitesse; // vitesse en m/s var $acceleration; // entier de 1 à 10; // Méthode importante : le constructeur, il doit porter le même nom que la classe, il servira à créer les objets. // Lors de la création de l'objet nous allons passer en argument les propriétés qui nous intéressent class Voiture extends VehiculeRoulant { // Nous savons que la voiture a plus de propriétés, nous allons donc les déclarer. var $modele; // entier indiquant le nom du var $demarre; // booléen indiquant si la voiture est en marche ou non var $vitesse; // entier indiquant la vitesse actuelle, -1 pour marche arrière, 0 pour point mort, 1 pour la 1ère, etc... var $type_moteur; // chaine indiquant le type de moteur : essence, diesel , gpl ou électrique var $type_boite; // chaine indiquant le type de boîte de vitesse : manuel ou automatique var $nb_vitesse; // entier indiquant le nombre de vitesse sur la boite var $conso_moteur; // entier indiquant la consommation du moteur en l/100km ou kW/100km var $nb_portes; // entier indiquant le nombre de portes de la voiture var $volume_coffre; // le volume du coffre en L // on pourrait en mettre plein d'autres, ce n'est pas le but ici. // Mais si nous voulons nous amuser un peu, nous allons penser notre voiture dans un espace en 2D... var $x; // abscisse var $y; // ordonnée var $direction; // direction en ° trigo var $vecteur_vitesse; // vitesse en m/s var $acceleration; // entier de 1 à 10; // Méthode importante : le constructeur, il doit porter le même nom que la classe, il servira à créer les objets. // Lors de la création de l'objet nous allons passer en argument les propriétés qui nous intéressent function Voiture($modele,$type_moteur,$type_boite,$nb_vitesse,$conso_moteur,$nb_portes,$volume_coffre) { // notez bien la syntaxe $this-> pour indiquer que nous parlons de la propriété de la classe et non d'une variable. $this->modele = $modele; // à l'inverse $modele est bien l'argument du constructeur $this->demarre = false; $this->type_moteur = $type_moteur; $this->type_boite = $type_boite; $this->nb_vitesse = $nb_vitesse; $this->conso_moteur = $conso_moteur; $this->nb_portes =$nb_portes; $this->volume_coffre = $volume_coffre; // de base notre voiture est à son point de départ et au point mort. $this->x = 0; $this->y = 0; $this->direction = 0; $this->vitesse = 0; $this->vecteur_vitesse = 0; $this->acceleration = 0; } function demarrer() { // Insertion de la clé dans la serrure, quart de tour et... $this->demarre = true; } function arreter() { // quart de tour inverse de la clé dans la serrure... $this->demarre = false; } function changer_vitesse($vitesse) { // Attention n'a pas plus de [i]nb_vitesse[/i] vitesses if($vitesse <= $this->nb_vitesse) { $this->vitesse = $vitesse; }
} function accelerer($force=1) { // Selon qu'on appuie plus ou moins fort sur la pédale on fera l'opération plusieurs fois for($i=0;$i<=$force;$i++) { // Si on est déjà au maximum de la pédale d'accélération, on change de rapport if($this->acceleration == 10) { // Là aussi on utilise $this-> pour indiquer qu'on parle de la méthode de la classe et non d'une fonction globale $this->changer_vitesse($this->vitesse+1); $this->acceleration = 1; } elseif($this->vitesse == 0) { // Si on est au point mort, il faut d'abord passer la première $this->changer_vitesse(1); $this->acceleration++; } else { // Sinon on appuie un peu plus sur le champignon (++ pour +1) $this->acceleration++; } } $this->calculer_vitesse(); } function ralentir($force=1) { // Selon qu'on appuie plus ou moins fort sur le frein on fera l'opération plusieurs fois for($i=0;$i<=$force;$i++) { // Si on a lâché la pédale d'accélération, on change de rapport if($this->acceleration == 0) { // mais freiner, ce n'est pas enclencher la marche arrière... if($this->vitesse != 0) { $this->changer_vitesse($this->vitesse-1); $this->acceleration = 5; } } else { // sinon on va juste lâcher un peu la pédale d'accélérateur $this->acceleration--; } } $this->calculer_vitesse(); } function calculer_vitesse() { // Calcul de la vitesse très approximatif... if($this->vitesse == 0) { $this->vecteur_vitesse = 0; } elseif($this->vitesse > 0) { $this->vecteur_vitesse = ($this->vitesse-1)*8+$this->acceleration; } elseif($this->vitesse < 0) { $this->vecteur_vitesse = ($this->vitesse+1)*6-$this->acceleration; } } // Cette fonction va se charger de recalculer la position de la voiture à partir de ses propriétés après une seconde de parcours function deplacer() { // Un peu de trigonométrie, on ajoute le cosinus (ou le sinus) multiplié par la vitesse en m/s pour avoir la nouvelle position en mètres $this->x += cos(deg2rad($this->direction))*$this->vecteur_vitesse; $this->y += sin(deg2rad($this->direction))*$this->vecteur_vitesse; } // Cette fonction est le volant, on indique le nombre de degré positif (gauche) ou négatif (droite) function tourner($degre) { $this->direction += $degre; } // Fonction pour tracer la position de la voiture, oui oui. function information() { return '<div style="position: absolute; top:'.(1000-$this->y).'px; left:'.($this->x+20).'px; width:4px; height:4px">.</div>'; // return '<b>'.round($this->x,2).'-'.round($this->y,2).'</b> => '.$this->vecteur_vitesse.'m/s<br/>'; } // Petite fonction bien pratique qui fait office de chauffeur function piloter($temps,$action='',$argument='') { for($i=0;$i<$temps;$i++) { if(method_exists($this,$action)) { if($argument != '') { $this->$action($argument); } else { $this->$action(); } } $this->deplacer(); echo $this->information(); } } }
$Twingo = new Voiture('Twingo 2','essence','auto',6,4.6,4,200); $Twingo->demarrer(); echo $Twingo->information();
$Twingo->piloter(10,'accelerer',2); // J'accélère pendant 15 secondes $Twingo->piloter(20); // Et garde ma vitesse pendant 20 secondes $Twingo->piloter(15,'tourner',5); // Tiens et si je tournais à gauche ? Je vais tourner mon volant à 5° à gauche pendant 15 secondes $Twingo->piloter(5,'accelerer'); // Et hop je réaccélère pendant 5 secondes $Twingo->piloter(5,'ralentir',3); // Attention, carrefour, je freine $Twingo->piloter(5,'tourner',18); // Et là j'engage un nouveau virage à gauche $Twingo->piloter(20,'accelerer'); // Je réaccélère pendant 15 secondes $Twingo->piloter(8,'ralentir',2); // Un rond-point arrive $Twingo->piloter(4,'tourner',-20); $Twingo->piloter(13,'tourner',20); $Twingo->piloter(3,'tourner',-20); $Twingo->piloter(15,'accelerer'); $Twingo->piloter(12,'ralentir'); // Stop ?>
Voilà un bel exemple de fini ! Pour ceux qui n'auraient pas installer un MAMP ou un Apache+PHP sur leur Mac, voici le résultat. A dire vrai, je ne pensais pas aller aussi loin dans l'exemple mais tant qu'à faire, ce n'était pas bien compliqué et ça change du développement web. Car au cas où vous ne l'auriez pas remarqué... il n'y a quasiment pas d'HTML, je m'en sers uniquement pour tracer des petits points afin de représenter la position de la voiture. L'objectif étant avant tout de démontrer la programmation objet avec PHP, je pense qu'il est pleinement atteint. Ce qui est surtout original ici c'est que l'on a utilisé un langage serveur dans un but qui se prête plus à un langage client comme le JavaScript, ou le Java, ou autres... Piloter une petite voiture ça peut se faire avec un clavier, mais rarement en tapant des lignes de code... Quoique, ça serait pas mal un Gran Turismo en PHP | |
| | | neiluj Parasite
Nombre de messages : 309 Age : 42 Planète : Neptune Matos : MacBook Air, MacBook Pro Unibody, iMac Alu, MacBook Black, Sanyo Z5 Date d'inscription : 18/09/2007
| Sujet: Re: Leçon de PHP n°2 : Les classes - niveau débutant 3/29/2008, 18:15 | |
| Prochaines leçons : MySQL et les formulaires, les Sessions Et puis quelque chose d'assez utile : exporter un document en PDF via PHP.
Si certains ont envie que je développe certains domaines particuliers du développement web avec PHP, n'hésitez pas à demander.
Je fais en fonction de mes disponibilités donc prochaine leçon pas avant la semaine prochaine. | |
| | | TG Légende vivante
Nombre de messages : 5793 Age : 60 Planète : Paradis n°2 Matos : MacBook Pro 16" 2019 Date d'inscription : 12/11/2006
| Sujet: Re: Leçon de PHP n°2 : Les classes - niveau débutant 3/29/2008, 18:20 | |
| C'est vraiment du super boulot, neiluj. Je connais déjà des qui s'en servent. On attend la suite... | |
| | | hr Légende vivante
Nombre de messages : 6919 Age : 70 Planète : Creuse Matos : mac mini M2 2023 en Ventura - mac mini fin 2014 en Monterey - iMac alu 2008 en El Capitan - G4 en 10.5 - iPhone 6s Date d'inscription : 19/11/2006
| Sujet: Re: Leçon de PHP n°2 : Les classes - niveau débutant 3/29/2008, 18:28 | |
| - TG a écrit:
- On attend la suite...
… avec impatience ! À propos, j’ai vu qu’on peut lire sans problème d’encodage une base mysql en utf-8 avec neooffice pour y récupérer des données dans le tableur ou le traitement de texte. Utile pour faire un catalogue papier à partir d’une base mise à jour à distance. Doit être possible aussi de se faire des formulaires pour modifier le contenu, mais comme la partie de neo/openoffice qui permet de faire ça est un clone horriblement ressemblant d’access, excel et les autres, non merci, plus facile de se faire un petit programme en php ! _______________ J’étais né pour rester jeune et j’ai eu l'avantage de m’en apercevoir le jour où j’ai cessé de l'être. Épitaphe de Georges Moinaux, dit Courteline
| |
| | | TG Légende vivante
Nombre de messages : 5793 Age : 60 Planète : Paradis n°2 Matos : MacBook Pro 16" 2019 Date d'inscription : 12/11/2006
| Sujet: Re: Leçon de PHP n°2 : Les classes - niveau débutant 3/29/2008, 21:17 | |
| | |
| | | hr Légende vivante
Nombre de messages : 6919 Age : 70 Planète : Creuse Matos : mac mini M2 2023 en Ventura - mac mini fin 2014 en Monterey - iMac alu 2008 en El Capitan - G4 en 10.5 - iPhone 6s Date d'inscription : 19/11/2006
| Sujet: Re: Leçon de PHP n°2 : Les classes - niveau débutant 3/29/2008, 22:11 | |
| _______________ J’étais né pour rester jeune et j’ai eu l'avantage de m’en apercevoir le jour où j’ai cessé de l'être. Épitaphe de Georges Moinaux, dit Courteline
| |
| | | Pomme-I Enkysté
Nombre de messages : 1993 Date d'inscription : 13/12/2006
| Sujet: Re: Leçon de PHP n°2 : Les classes - niveau débutant 12/4/2008, 14:03 | |
| | |
| | | hr Légende vivante
Nombre de messages : 6919 Age : 70 Planète : Creuse Matos : mac mini M2 2023 en Ventura - mac mini fin 2014 en Monterey - iMac alu 2008 en El Capitan - G4 en 10.5 - iPhone 6s Date d'inscription : 19/11/2006
| Sujet: Re: Leçon de PHP n°2 : Les classes - niveau débutant 12/4/2008, 14:08 | |
| - Pomme-I a écrit:
- Mais c'était cool tes cours de PHP... si un de ces jours tu avais un peu de temps ce serait si tellement trop bien
Ouais, c’est bien vrai, je ne dis rien mais j’attends aussi… _______________ J’étais né pour rester jeune et j’ai eu l'avantage de m’en apercevoir le jour où j’ai cessé de l'être. Épitaphe de Georges Moinaux, dit Courteline
| |
| | | V8 Enkysté
Nombre de messages : 1234 Age : 59 Planète : en péril Matos : iMac G4- iMac Intel C2D - iPhone 3 GS- Date d'inscription : 19/11/2006
| Sujet: Re: Leçon de PHP n°2 : Les classes - niveau débutant 12/7/2008, 17:49 | |
| D'autant plus ça tombe bien , j'ai eu mon premier cours de Php la semaine dernière ! Au début c'est facile mais bon, je m'attends au pire … Je lirai donc attentivement la suite, s'il y a une suite | |
| | | hr Légende vivante
Nombre de messages : 6919 Age : 70 Planète : Creuse Matos : mac mini M2 2023 en Ventura - mac mini fin 2014 en Monterey - iMac alu 2008 en El Capitan - G4 en 10.5 - iPhone 6s Date d'inscription : 19/11/2006
| Sujet: Re: Leçon de PHP n°2 : Les classes - niveau débutant 12/7/2008, 19:52 | |
| - V8 a écrit:
- je m'attends au pire
Non, le php c’est plutôt bien fichu et assez souple. Il vaut mieux tout de suite programmer en objet pour ne pas avoir à modifier sa façon de penser par la suite, mais les objets sont sur le même principe qu’en java ou d’autres langages. La syntaxe aussi en est proche et les différences sont faciles à assimiler. Non, ne t’inquiète pas, c’est très bien le php ! _______________ J’étais né pour rester jeune et j’ai eu l'avantage de m’en apercevoir le jour où j’ai cessé de l'être. Épitaphe de Georges Moinaux, dit Courteline
| |
| | | neiluj Parasite
Nombre de messages : 309 Age : 42 Planète : Neptune Matos : MacBook Air, MacBook Pro Unibody, iMac Alu, MacBook Black, Sanyo Z5 Date d'inscription : 18/09/2007
| Sujet: Re: Leçon de PHP n°2 : Les classes - niveau débutant 12/13/2008, 10:05 | |
| | |
| | | Contenu sponsorisé
| Sujet: Re: Leçon de PHP n°2 : Les classes - niveau débutant | |
| |
| | | | Leçon de PHP n°2 : Les classes - niveau débutant | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |