Cours/atelier PHP objet.
Réponse AJAX

Objectif

Créer une classe et l'instancier

La classe

La syntaxe pour créer une classe est la suivante :

Les propriétés

Ici on rajoute les propriétés nom, prénom et date de naissance :

Les méthodes

Ici on rajoute une méthode getAge, qui renvoie l'âge en fonction de la date de naissance (en supposant que la date de naissance est au format "1973-02-25"). Remarquez $this qui représente l'objet courant, et $this->dateDeNaissance qui permet d'accéder à une de ses propriétés :

Instanciation de la classe, mot-clé new

Voici le code qui permet d'instancier la classe, de définir le nom et la date de naissance, puis d'afficher l'âge. Remarquez le mot-clé new qui permet d'instancier :

Ajoutez une méthode getPatronyme() qui renvoie "Prénom NOM" :

Votre réponse n°1

Modifiez la méthode getAge() de façon à ce qu'elle renvoie "âge inconnu" lorsque la date de naissance a pour valeur null (utilisez is_null), et elle renvoie par exemple "32 ans" lorsque la date de naissance est connue.

Gérez le "s" du pluriel : "1 an", "2 ans", ...

Votre réponse n°2

Constructeurs et destructeurs

Constructeur PHP (depuis PHP 5)

Voici un constructeur PHP (function __construct()). On écrit donc :

Constructeur paramétré

Et voici un script avec un constructeur qui reçoit cette fois-ci des paramètres (optionnels puisqu'on leur a donné une valeur par défaut grâce à =null). Remarquez les différentes instanciations, toutes valables :

Destructeur PHP 5

Voici la syntaxe du destructeur en PHP : Le Destructeur est appelé au moment où on détruit l'objet, c'est à dire : Le destructeur permettra de libérer les ressources utilisées par l'objet (connexions aux BDD, fermeture de fichiers, etc.).

Les accesseurs, le mot-clé protected

L'accesseur permet de lire et modifier une propriété indirectement grâce à une méthode dédiée (au lieu d'accéder directement à la propriété). Voici par exemple les accesseurs pour le nom de la classe personne. Remarquez le mot-clé protected qui interdit d'accéder directement à la propriété (il existe également private qui est encore plus restrictif,plus d'infos ici) : Ou voilà une autre écriture plus élégante (dans la logique de JQuery), où le même accesseur joue le rôle de lecture et d'écriture :

Quel message d'erreur obtenez-vous si, en dehors de la classe, vous essayez d'accéder à une propriété déclarée comme protected ?

Votre réponse n°3

Écrivez pour les accesseurs le prénom et la date de naissance.

Votre réponse n°4

Les méthodes de classe, le mot-clé static

Ecrire et lire un objet simple dans une base de données MySQL

Introduction à ma méthode

Ecriture

Lecture

Dans votre base de données v_anonyme_db, créez une table pour accueillir les personnes ci-dessus.

À partir de la classe Personne ci-dessus, écrivez vos méthodes :
from_mysql(id) qui récupère l'objet depuis la base de données,
to_mysql() qui écrit ou modifie l'objet dans la base de données.

Remarque : ajoutez une propriété 'id'. Quand on crée une nouvelle personne, son id est null. C'est quand on l'écrit pour la première fois dans la base de données que MySQL choisit un ID automatique, qu'on affecte aussitôt à notre objet (de façon à garder synchronisées les données dans MySQL et en PHP).

Collez l'ensemble du code ici après l'avoir testé :

Votre réponse n°5

Héritage et redéfinition de méthodes

Principes

Appel aux méthodes de la classe mère

Quand on surcharge les méthodes de la classe mère, on peut faire appel au code d'origine de la classe mère avec :

Les constantes de classe

On peut déclarer des constantes propres à la classe, en utilisant la syntaxe suivante (à partir de PHP 7.1) : Il existe également le mot-clé parent (au lieu de self) qui permet d'accéder aux constantes de la classe mère.

Les classes abstraites

(exemple avec Testomatic)

Une classe abstraite est une classe où certaines méthodes ont seulement leur en-tête de définie, mais elles ne sont pas implémentées (elles n'ont pas de code).

Une telle classe ne peut être instanciée, mais on pourra instancier les classes filles dans lesquelles toutes les méthodes abstraites sont implémentées.

D'autres fonctions et mots-clés liés aux objets

Etc., toutes les fonctions ici : http://fr.php.net/manual/fr/ref.classobj.php

Exercice d'application : création d'une classe Collection

On veut écrire une classe Collection.

Elle dispose d'une propriété : un tableau $tab qui va stocker chaque valeur de la collection (remarque : en environnement PHP et en utilisant un tableau, on n'a pas besoin d'initialiser ce dernier. Il n'en sera pas de même dans la plupart des autres environnements).

Son interface est composée des méthodes publiques suivantes :

Pour réaliser cela, vous utiliserez les fonctions PHP de traitement de tableau : count, array_pop, array_shift, reset, next, key (renvoie l'indice courant, renvoie null si on a dépassé la fin du tableau).

Est-ce que la propriété $tab va être déclarée en public, protected ou private ? Pourquoi ?

Votre réponse n°6

Ecrivez le code entier de la classe.

Votre réponse n°7

Testez votre classe avec le code suivant. Le résultat affiché doit être : 12765.

Utilisation de la classe collection

On va rajouter à une personne la liste de ses enfants.

Dans la classe personne, rajoutez une collection $listeEnfants.

Ajouter une méthode ajouteEnfant($prenom, $dateDeNaissance) qui :
- instancie un objet de classe personne qui correspond à l'enfant,
- ajoute cet objet (l'enfant) à la collection $listeEnfants.

Écrivez ici le code que vous avez ajouté à la classe question :

Votre réponse n°8

Dans cette même classe personne, ajouter une méthode afficheFiliation() qui renvoie (return) les prénoms et âges de tous les enfants d'une personne. Le résultat doit être de la forme :
Bobby (1 an), Marie (4 ans), Paul (7 ans).

Écrivez ici le code de la méthode afficheFiliation() :

Votre réponse n°9

Testez tout ça avec la personne Ella Dégoss (née le 12 avril 1983, mariée, nom de jeune fille : Padgoss), qui a pour enfant Bobby (né le 26 août 2021), Marie (née le 21 juillet 2018) et Paul (né le 15 décembre 2015).

Écrivez ici le code qui sert à tester (n'écrivez pas la classe personne) :

Votre réponse n°10

Faite afficher le résultat des méthodes getPatronyme() et afficheFiliation() puis écrivez ici le résultat obtenu :

Votre réponse n°11