Définition
Un objet est quelque chose que peut gérer un programme
- une variable
- un concept
- un ensemble de données regroupées sous un nom
Il était une fois ... mon nom est Personne
Au début était la variable. Euh c'est toujours le cas.
Ensuite, on a imaginer des données regroupées dans des tableaux :
Pour une association, une personne adhérente est composée de :
- un nom,
- un prénom,
- une date de naissance,
- un cotisation payée,
- une date de paiement de cotisation,
- etc...
Problème :
Comment stocker ensemble toutes les données appartenant à une même personné ?
Solutions tableau
1, le tableau simple
Au début, il n'y avait qu'un tableau pour stocker tout ça :
<?php // définition d'une personne $unePersonne = array("leNom", "lePrenom", "2000/11/12", "payé", "2023/11/12"); // ajout d'une personne dans la liste $lesPersonnes[] = $unePersonne; // renseigner la date de paiement de la cotisation de la personne n°3 $lesPersonnes[3][4]= "2023/12/11"; // afficher le nom et prénom de la personne n°3 echo "personne n°3= ".$lesPersonnes[3][0]." ".$lesPersonnes[3][1]; ?>
C'est un peu sec, non ?
2, le tableau associatif
Ensuite, on pouvait utiliser des indices alphabétiques au lieu de numérique :
<?php // définition d'une personne $unePersonne = array( 'nom' =>"leNom", 'prenom' => "lePrenom", 'datNaiss' => "2000/11/12", 'cotis' => "payé", 'datCotis' => "2023/11/12" ); // ajout d'une personne dans la liste $lesPersonnes[] = $unePersonne; // renseigner la date de paiement de la cotisation de la personne n°3 $lesPersonnes[3]['datCotis']= "2023/12/11"; // afficher le nom et prénom de la personne n°3 echo "personne n°3= ".$lesPersonnes[3]['nom']." ".$lesPersonnes[3]['prenom']; ?>
C'est un peu un peu mieux, mais on reste sur sa faim en termes de facilité de lecture ...
Solution 2 : les structures de données
1, la structure de données du C
Et puis le C a inventé la structure de donnée ou type structuré (code aproximatif, le type date n'existe pas en tant que tel) :
// définition d'une personne struct Personne { char nom[50]; char pnom[50]; Date dateNaiss; bool cotisPayee; Date cotisDate; }; unePersonne = struct Personne; unePersonne.nom = "leNom"; unePersonne.prenom = "lePrenom"; unePersonne.datNaiss = "2000/11/12"; unePersonne.cotisPayee = "payé"; unePersonne.cotisDate = "2023/11/12"; ); // ajout d'une personne dans la liste lesPersonnes Personne[]; lesPersonnes[sizeof(lesPersonnes)+1] = unePersonne; // renseigner la date de paiement de la cotisation de la personne n°3 lesPersonnes[3].cotisDate = "2023/12/11"; // afficher le nom et prénom de la personne n°3 printf("personne n°3= %s %s", lesPersonnes[3].nom, lesPersonnes[3].prenom); ?>
Les types structurés c'est pas mal. On est assez proche de la prog objet.
Cependant, faire des calculs automatisés, c'est difficilement faisable sans être explicite. il manque un truc
Et si on mettait des fonctions dans le type structuré ?
2, la naissance de l'objet
Et voilà, on y arrive enfin. on groupe toutes les propriétés et les opérations de l'objet dans un conteneur nommé classe et le tour est joué.
Le seul défaut est que pour faire propre, on place la définition de la classe dans un fichier et son utilisation dans un autre.
Classe Personne
<?php class Personne { // attributes private $nom; private $pnom; private $dateNaiss; private $cotisPayee; private $cotisDate; // setters : comment remplir les attributs public setNom($nom) {$this->nom=$nom;} public setPnom($pnom) {$this->pnom=$pnom;} public setDNaiss($date) {$this->dateNaiss=$date;} // getters : obtenir le contenu des attributs public getNom($nom) {$this->nom=$nom;} public getPnom($pnom) {$this->pnom=$pnom;} public getDNaiss($date) {$this->dateNaiss=$date;} // methods : Opérations faisables avec l'objet public validerCotisation() { $this->cotisPayee= true; $this->cotisDate = date("Y/m/d"); } public getNomPnom() { return $this.nom." ".$this.prenom; } public __constructor($nom, $pnom, $dNaiss){ $this->nom=$nom; $this->pnom=$pnom; $this->dateNaiss=$date; } } ?>
créer et afficher une personne
<?php // créer une personne unePersonne = new Personne("leNom", "lePrenom", "2023/11/12"); // ajout d'une personne dans la liste des personnes lesPersonnes Personne[]; lesPersonnes[sizeof(lesPersonnes)+1] = unePersonne; // renseigner la date de paiement de la cotisation de la personne n°3 lesPersonnes[3]->validerCotisation(); // afficher le nom et prénom de la personne n°3 echo "personne n°3= " + lesPersonnes[3].getNomPnom(); ?>