Exercices
Questions à choix multiple

Leçon N° 08 : Classes et objets

Introduction
Anatomie d'une classe
Anatomie d'un programme utilisant les classes
Les objets
Un exemple un peu plus complet
Résumé des paragraphes précédents
Organisation des fichiers
Notion d'héritage
L'opérateur ::
PHP5 : Nouveautés PHP5
PHP5 : Variables de classes privées et protégées
PHP5 : Méthodes privées et protégées
PHP5 : Classes et méthodes abstraites
PHP5 : Les interfaces
Notes de page

Introduction : qu'est-ce qu'une classe ?

Les classes sont, comme les fonctions, des dispositifs permettant la réutilisation du code, mais le système des classes est extrêmement plus sofistiqué. Les caractéristiques les plus importantes sont :

Anatomie d'une classe

CodeCommentaires

<?php
class maClasse
{
/* On commence par le mot-clé class suivi du nom de la classe */
var $maPropriété_1
var $maPropriété_2
. . . . . . .
/* variables de classe = Propriétés , déclarées à l'aide du mot-clé var on les appelle à l'aide de la syntaxe suivante :
maClasse -> maPropriété_1 */
function maClasse
{
     code
}
    /* Le constructeur de la classe
  • Porte le même nom que la classe
  • S'execute automatiquement lors de l'appel de la classe */
function mamaMéthode(paramètre_1, paramètre_2...)
{
     code de la fonction;
}
    /* Les autres fonctions de la classe
  • s'appellent des "méthodes"
  • on les appelle à l'aide de la syntaxe suivante :
    maClasse -> maMéthode(paramètre_1, paramètre_2...) */
. . . . lignes de code quelconques;
this -> maMéthode(param_1, param_2)
    /* quand on appelle une méthode qui est dans la classe dans laquelle on se trouve, on utilise le mot-clé this */
. . . . lignes de code quelconques;
this -> maPropriété_1 = "vert"
    /* un accéde aux propriétés de la classe elle-même comme aux méthodes (mot clé this) */
}
?>

Anatomie d'un programme utilisant une classe

CodeCommentaires

<?php
monObjet = new maClasse ;
/* Le mot-clé new permet de créer une instance de la classe (objet).
C'est à ce moment que le constructeur s'execute, s'il y en a un dans la classe*/

<?php
monObjet -> maMéthode(param_1, param_2...) ;
/* Appel d'une méthode de la classe*/

<?php
monObjet -> maPropriété_1 = "bleu" ;
/* Appel d'une propriété de la classe*/

Notre première classe
Nom du fichier : exercises_08/lesson_08_add.php

Les objets

Une fois qu'une classe a été définie, PHP vous permet d'engendrer autant d'instance de la classe que vous voudrez. Ces instances d'une classe sont dites des "objects". Chacune de ces instances est un objet complètement indépendant, avec ses propres propriétés et méthodes, et peut être remodelé ainsi indépendamment d'autres instances. Ceci est interessant dans les cas où vous devez engendrer plus d'une instance d'un objet - par exemple, de deux liens simultanés de base de données pour deux requetes simultanées. Les classes vous aident également à séparer votre code dans les modules indépendants, et simplifient de ce fait l'entretien et les changements de code.

Un exemple un peu plus complexe

On se propose de construire une classe de validation de formulaire. Cette classe va rassembler toute une panoplie de méthodes permettant de tester les données saisies par l'utilisateur. Ainsi à chaque nouveau formulaire il suffira d'aller puiser dans la classe les méthodes de validation adéquates. La classe va consister en 1. Une série de méthodes qui acceptent les données à valider comme arguments de méthode, examine ces données pour voir si elles sont valides et renvoie un code et / ou un messge approprié au résultat de la validation 2. Une structure PHP (ici, un tableau associatif) : liste de toutes les erreurs rencontrées pendant le procédé de validation, et des méthodes pour manoeuvrer cette structure. Il est important de noter, cependant, que ces méthodes n'auront rien à faire avec la présentation visuelle du formulaire ou de la page du résultat du formulaire; plutôt, ils fournissent un moyen simple pour effectuer la validation des données saisies dans le formulaire.
Une classe pour valider un formulaire
Nom du fichier : exercises_08/lesson_08_form_1.php

Résumé des paragraphes précédents :

Organisation des fichiers :

En fait il faut pas moins de 5 fichiers pour réaliser un formulaire qui soit élégant (feuille de style), modulaire , donc facile à modifier (classes), stable, pratique à utiliser (messages d'erreur appropriés à chaque erreur de saisie, rechargement automatique des données saisies) :

Pour plus de simplicté tous les fichiers sont réunis dans le même répertoire En fait dans la réalité ce n'est pas le cas, pour un site réel, il y a plutôt un répertoire pour les classes, un autre pour feuilles de style...

Un formulaire élaboré
Nom du premier fichier : exercises_08/lesson_08_form_2.php

L'héritage

On dit qu'une classe hérite d'une autre classe lorsque elle possède en elle touts les composants (méthodes, variables...) d'une autre classe. Contrairement au système de fonctions qui permet d'appeler une fonction à l'intérieur d'une autre fonction, avec la syntaxe normale d'appel de fonction, le système d'héritage fonctionne au moyen d'un mot-clé spécial extends à utiliser uniquement lors de la déclaration de la classe.
Ainsi lorsque on veut mettre en place une classe qui hérite d'une autre classe, on va écrire

<?php
class nouvelleClasse extends ancienneClasse
{
. . . . }
?>

La classe nouvelleClasse va hériter de tous les composants de la classe ancienneClasse
Tous les constructeurs des classes parentes vont s'executer lors de l'instantiation de la classe fille :
Un exemple très simple pour illustrer l'hériage
Nom du fichier : exercises_08/lesson_08_heritage.php
Anticipation leçon mySQL : Exemple avec héritage : Lecture d'une table
Nom du fichier : exercises_08/lesson_08_db_lecture.php
Anticipation leçon mySQL : Exemple avec héritage : Ecriture dans une table
Nom du fichier : exercises_08/lesson_08_db_ajout.php
Anticipation leçon mySQL : Exemple avec héritage : Effacement dans une table
Nom du fichier : exercises_08/lesson_08_db_efface.php

L'opérateur ::

L'opérateur :: est utilisé à la place de -> pour se referrer à des fonctions et variables de la classe de base ou à des fonctions qui appartiennent à des classes qui n'ont pas encore d'instances. Dans l'exemple ci-après, on appelle la fonction example(), mais il n'y a aucun objet créé à partir de la classe A, aussi nous ne pouvons pas écrire $a->example(), c'est pourquoi nous appelons example() comme une 'fonction de classe', c'est à dire une fonction de la classe elle-même, et pas un objet résultant de l'instantiation de la classe. Une "fonction de classe" ne peut utiliser aucune variable d'objet (ne peut utiliser $this) La classe B redéfinit la fonction example(), la définition originale (classe A) devient cachée et n'est plus disponible, à moins que vous n'utilisiez l'opérateur :: pour y accéder.
Les opérateurs :: et => (PHP4 et 5)
Nom du fichier : exercises_08/lesson_08_operators.php

Nouveautés PHP5 relatives aux classes

Constructeurs et destructeurs
Nom du fichier : exercises_08/lesson_08_php_5_constructeurs.php
  • Les objets sont passés par référence par défaut, et non plus par valeur
  • Les methodes peuvent être surchargées, sauf celles qui sont déclarées "final"
  • Gestion des exeptions (mots-clés "try" , "catch", "throw") : voir à la fin du chapitre 11
  • PHP5 : Variables de classes privées et protégées

    Le moteur Zend 2.0 introduit les variables privées et protégées :
    Les variables de classes protégées peuvent être accédées par les classes dérivées des classes dans lesquelles elles sont protégées , tandis que les variables de classes privées ne peuvent être utilisées que dans les classes dans lesquelles elles sont déclarées (sauf accès direct avec l'opérateur ::).
    Les variables de classe en php5
    Nom du fichier : exercises_08/lesson_08_php_5_variables_de_classe.php

    PHP5 : Méthodes privées, protégées

    Le concept est le même que pour les variables (voir ci-dessus)
    Méthodes privées, protégées
    Nom du fichier : exercises_08/lesson_08_php_5_methodes_privees.php

    PHP5 : Classes et methodes abstraites

    Les classes abstraites sont des classes qui ne peuvent pas être instanciées.
    Elles peuvent donc être seulement "étendues" au moyen de l'héritage. Une méthode abstraite ne peut être déclarée que dans une classe abstraite et ne peut contenir de code mais seulement des commentaires (signature). Une classe qui contient une methode abstraite doit être déclarée abstraite elle-même
    Classes et methodes abstraites
    Nom du fichier : exercises_08/lesson_08_php_5_classes_abstraites.php

    PHP5 : Les interfaces

    Une classe abstraite peut contenir des methodes abstraites et des méthodes non-abstraites. Une interface est une classe qui ne contient que des methodes abstraites. Les interfaces sont donc toujours abstraites, sans qu'il soit necessaire de l'indiquer; il n'est pas non plus necessaire de déclarer leurs methodes comme étant abstraites. Dans le cas des interfaces, le mot-clé "implements" , qui remplace "extends", peut être suivi de plusieurs noms d'interfaces, contrairement à "extends" qui ne peut être suivi que d'un seul non de classe
    Interfaces
    Nom du fichier : exercises_08/lesson_08_php_5_interfaces.php

    Tous droits réservés. 2005-2008