Introduction à PHP objet

Transcription

Introduction à PHP objet
Chapitre 5 – Introduction à PHP objet
1. Notions
Classe
Une classe est un type abstrait, c’est un modèle pour créer plusieurs objets concrets présentant des
caractéristiques communes. Elle a un état (propriétés), un comportement (méthodes), et un
constructeur.
Ex : class Humain
Objet
Un objet est une instance d’une classe. Ex : humain1, humain2, …
Propriété ou donnée membre
Caractéristique d'une instance ou d’une classe. Les propriétés sont des variables.
Ex : nom, prenom, sexe (propre à une instance), nombre d’humains (propre à la classe)
Méthode ou fonction membre
Une méthode est une fonction qui manipule une ou plusieurs propriétés d’un objet. Par exemple pour la
classe Humain la méthode age calcule l’âge d’une instance (âge d’un humain donné). On pourrait
également définir en PHP5 un méthode nombre qui retournerait le nombre d’instances de la classe.
Constructeur
Fonction appelée automatiquement lors de la création d’une instance. Le constructeur a le même nom
que la classe en PHP4 (__construct en PHP5). Il peut avoir 0, 1 ou plusieurs arguments.
Ex : Humain($nom, $prenom, $sexe, $habite, $an)
class Humain{
// proprietes (donnees membres)
var $nom;
var $prenom;
var $sexe;
var $ville;
var $annee;
// constructeur
function Humain($nom,
$this->nom
$this->prenom
$this->sexe
$this->ville
$this->annee
}
// Ex de classe en PHP 4
$prenom, $sexe, $habite, $an){
= $nom;
= $prenom;
= $sexe;
= $habite;
= $an;
// methode (fonction membre)
function age(){
return (date("Y") - $this->annee) ;
}
}
©Magali Contensin
avril 2006
1/9
2. Créer et manipuler des instances de classe
2.1 Création
Syntaxe
$instance = new NomClasse();
$instance = new NomClasse(arg1, ..., argN);
Exemple
$client1 = new Humain('Dupond', 'Pierre', 'M', 'Marseille', 1950);
2.2 Accès aux propriétés
Syntaxe
$nom_instance->nom_propriete
Exemple
echo "{$client1->prenom} {$client1->nom}"; // affichera Pierre Dupond
Un objet obj peut être sérialisé (lecture/écriture d’un objet) par session $_SESSION[‘nomobj’].
3. Méthodes
Syntaxe
function nom_fonction(arg1, ..., argN){
// code fonction
}
this
this est utilisé dans les méthode pour faire référence à l’objet en cours (l'instance qui a reçu le
message). Par exemple dans la fonction age $this->annee fournira l’année de naissance de
l’objet pour lequel une demande d’âge a été effectuée.
Envoi de message à l'objet
$nom_instance->nom_methode(arg1, ..., argN)
Exemple
echo "{$client1->prenom} {$client1->nom} a ", $client1->age(), " ans ";
// affichera Pierre Dupond a 56 ans
4. Comparaisons d’objets
PHP 4 : deux instances de la même classe peuvent être comparées avec l’opérateur « == ». Deux
objets sont égaux s’ils ont les mêmes valeurs et les mêmes attributs et s’ils sont des instances de la
même classe.
PHP 5 :
 Opérateur « == » : deux instances sont égales si elles ont les mêmes attributs, les mêmes valeurs et
sont des instances de la même classe
 opérateur « === » : deux objets sont identiques si et seulement si ils réfèrent à la même instance de la
même classe.
©Magali Contensin
avril 2006
2/9
5. Héritage
Une classe peut hériter d’une autre classe (sous-classement). La sous-classe ou classe fille est une
spécialisation de la super-classe (classe mère). La classe fille possède les variables et méthodes de la
super-classe plus des propriétés et méthodes spécifiques. Quand des méthodes sont ajoutées on parlera
d’enrichissement. Lorsqu’une méthode de même signature est réécrite dans la classe fille on parlera de
redéfinition.
Les classes filles doivent toujours être définies après la super-classe.
PHP propose un héritage simple : une classe hérite d’une et une seule classe. Mais il est possible de
simuler l’héritage multiple avec des interfaces comme en Java.
class Transport {
var $consommation;
var $vitesse;
var $nb_voyageurs;
function duree($km){
// calcul de la duree du trajet
}
function consomme($km){
// calcul de la consommation
}
}
class Voiture extends Transport{
var $marque_pneus;
function dist_freinage($vitesse, $etat_sol){
// calcul de la distance de freinage
}
}
class Voilier extends Transport{
var $nb_voiles;
function portance($incidence, $corde, $hauteur, $vitesse_vent){
// calcul de la portance
}
}
Opérateur de résolution de portée ::
Cet opérateur permet d’accéder aux variables de classes et aux constantes de classe. Il permet aussi
d’appeler le constructeur d’une super-classe ou ses méthodes quand il y a redéfinition.
parent
parent permet de faire référence à une propriété ou une méthode de la super-classe. Plutôt que d’utiliser
le nom de la classe mère dans le code on utilise parent qui fait référence au nom qui apparaît dans le
« extends » :
parent::nom_methode(args)
©Magali Contensin
avril 2006
3/9
6. Fonctionnalités spécifiques à PHP 5
 Visibilité des données membres :
o public (accès public),
o protected (accès limité aux classes filles et mères),
o private (accès uniquement dans la classe).
Attention il n’y a plus de déclaration var en PHP 5.
 Visibilité des fonctions membres :
o public
o protected
o private
Par défaut une méthode est créée avec une visibilité publique.
 Propriétés et méthodes de classe (mot clé static). Un membre statique ou une méthode statique
peut être accédé sans instanciation de la classe. Un membre statique est accédé par une méthode
statique. Il ne peut y avoir de pseudo-variable $this dans une méthode statique (car elle est
appelée sans instance de l’objet). De même on ne peut pas accéder aux propriétés statiques avec
le nom de l’objet suivi de ->. Il faut utiliser l’opérateur :: et le nom de la classe ou self.
 Constantes de classes : const nom_constante = valeur_constante;
Une constante n’a pas de $ devant son nom. Elle ne peut pas être accédée directement par un
objet. La visibilité est publique. Humain::doigts.
 Finalisation : __destruct()
 final : une classe fille ne peut pas redéfinir une méthode si dans la classe mère la méthode est
« final ». Il est impossible d’hériter d’une classe qui est préfixée par le mot-clé final.
 Classes et méthodes abstraites. Une classe abstraite (mot clé abstract) ne peut pas être
instanciée. Toute classe comportant au moins une méthode abstraite est une classe abstraite.
Une méthode abstraite contient simplement la signature. Une classe qui héritera de la classe
abstraite devra définir toute méthode abstraite (l’implémentation de la méthode est faite par la
classe fille). Par exemple, la classe Transport devrait être déclarée abstraite car c’est une
classe qui ne doit pas avoir d’instances. Ce sont ses classes dérivées (voiture, voilier, train, …)
qui seront instanciées.
 Interface. Une interface (mot-clé interface) est une spécification : elle fixe la liste des
méthodes qu’on est certain de trouver dans toute classe qui déclare être conforme à la
spécification. L’interface spécifie quelles méthodes une classe devra implémenter (seules les
signatures sont données). Toutes les méthodes de l’interface sont publiques. Lorsqu’on
implémente une interface (mot clé implem ents) il faut définir toutes les méthodes.
 Surcharge avec __call, __get et __set
 Parcourir un objet : il est possible d’obtenir toutes les propriétés visibles d’un objet avec un
foreach.
 Clonage : le mot-clé clo ne permet de créer une copie de l’objet.
 Introspection (réflexion) : possibilité d’apprendre des informations sur toute classe (reverse
engineering).
©Magali Contensin
avril 2006
4/9
<?php
// fichier humain.php
class Humain{
// donnees membres
private $nom;
// variables d'instance
private $prenom;
private $sexe;
private $ville;
private $annee;
private static $nb = 0; // variable de classe
const doigts = 5;
// constante de classe
// constructeur
function construct($nom, $prenom, $sexe, $habite, $an){
$this->nom
= $nom;
$this->prenom
= $prenom;
$this->setSexe($sexe);
$this->ville
= $habite;
$this->setAnnee($an);
self::$nb++;
}
// accesseurs
function getNom()
{
function getPrenom(){
function getSexe() {
function getVille() {
function getAnnee() {
return
return
return
return
return
$this->nom; }
$this->prenom; }
$this->sexe; }
$this->ville;}
$this->annee; }
// modificateurs
function setAnnee($annee){
if (($annee > 1900) && ($annee < date("Y"))){
$this->annee = $annee;
}
else{ echo "annee $annee non valide pour $this->nom<br>"; }
}
function setSexe($sexe){
if (($sexe == 'M') || ($sexe == 'F')){
$this->sexe = $sexe;
}
else{ echo "sexe $sexe incorrect pour $this->nom<br>"; }
}
// fonction membre (methode d'instance)
function age(){
if ($this->annee != 0){
return (date("Y") - $this->annee) ;
}
else{
return "undefined"; }
}
// fonction membre (methode de classe)
function nombre(){
return self::$nb;
}
}
?>
©Magali Contensin
avril 2006
5/9
<?php
// inclusion de la classe Humain
require("humain.php");
// creation d'instances de la classe
$liste[] = new Humain('Dupond', 'Pierre', 'M', 'Marseille', 1950);
$liste[] = new Humain('Gantt', 'Paul', 'M', 'Paris', 1970);
$liste[] = new Humain('Dujardin', 'Anne', 'F', 'Bordeaux', "azer");
$liste[] = new Humain('Armand', 'Ludovic', 'x', 'Toulous', 1995);
// modification d'une propriete d'une instance
$liste[1]->setAnnee(2007);
// affichage des instances
echo "<br>Liste :<br>";
foreach ($liste as $client){
echo "- {$client->getPrenom()} {$client->getNom()} a ",
$client->age(), " ans<br>";
}
// affichage des donnees de classe
echo "<br>il y a ", Humain::nombre(), " humains<br>";
echo "un humain a ", Humain::doigts, " doigts par main";
?>
annee azer non valide pour Dujardin
sexe x incorrect pour Armand
annee 2007 non valide pour Gantt
Liste :
- Pierre Dupond a 56 ans
- Paul Gantt a 36 ans
- Anne Dujardin a undefined ans
- Ludovic Armand a 11 ans
il y a 4 humains
un humain a 5 doigts par main
©Magali Contensin
avril 2006
6/9
7. Résumé et choix (PHP 5)
Programmer objet c’est définir des classes, leurs données et comment elles communiquent.
données membres
variables d’instances
variables de classes
static
état
constantes de classes
const
classe
type abstrait
fonctions membres
comportement
constructeur
Initialiser les données
accesseurs
modificateurs
accès aux variables d’instances ou
aux variables de classe
static
méthodes d’instances
méthodes de classes
fonctions privées
private
méthodes de finalisation
__destruct
7.1 Données membres d’une classe (attributs ou propriétés)
a) Variable de classe ou variable d’instance ?
-
-
La donnée varie selon l’instance  variable d’instance
o une copie de la variable par objet, la copie est initialisée lors de l’instanciation de la
classe
o ex : couleur des cheveux pour un objet Humain
La donnée est partagée par tous les objets de la classe  variable de classe
o un seul exemplaire de la variable auquel toutes les instances accèdent : une seule copie
initialisée lors de la création de la classe (toutes les instances de la classe voient la même
valeur) ~ variable globale en C
o ex : compteur du nombre d’instances de la classe (nombre d’humains)
b) Variable locale à une méthode ou variable d’instance de la classe ?
-
propriétés de l’objet  variables d’instances
o déclarées en dehors de toute méthode
o ex : couleur des cheveux, nom, prénom, date de naissance
si la variable doit être utilisée par plusieurs méthodes de la classe  var. d’instance
sinon variable locale à la méthode
o ex : calcul de l’age (on peut utiliser une variable locale pour stocker la date du jour)
c) Constante de classe ?
-
la valeur de la constante est partagée par tous les objets de la classe  constante de classe
o proche du #define du C
o ex : nombre de doigts d’un humain
d) Quelle protection d’accès pour les données membres (hors constantes) ?
`
mot-clé
public
protected
private
Visibilité
lecture/écriture dans tout le script
lecture/écriture pour les super-classes et les classes dérivées directes ou indirectes
lecture/écriture uniquement au sein de la classe.
©Magali Contensin
avril 2006
7/9
-
-
les variables d’instance doivent autant que possible être private (toute donnée membre qui
peut être rendue privée doit l’être)
o lecture par accesseur
o modification par modificateur
 avantage = on peut modifier en contrôlant la validité de la modification,
cohérence interne des données (nombre compris entre deux bornes, nombres
positifs, …)
 implémentation masquée, si des modifications ont lieu dans la classe, comme le
changement d’un type de données, il est inutile de réécrire les classes qui
l’utilisent.
exceptionnellement accès public à une variable d’instance ou de classe (plus que déconseillé)
o avantage = accès plus rapide (on ne passe pas par un accesseur)
o possible uniquement s’il n’y a pas possibilité d’affecter des données aberrantes
7.2 Fonctions membres d’une classe (comportements)
Les différentes méthodes d’une classe :
- constructeur : initialisation de l’instance ;
- méthodes permettant l’accès ou la manipulation des données membres depuis l’extérieur
o accesseurs -> public
o modificateurs -> public
- méthodes d’instances réalisent des opérations sur des variables d’instances (calcul de l’âge) ;
- méthode de classe = méthode qui ne dépend pas de l’instance ;
- méthodes redéfinies = méthodes de même signature que la méthode de la super-classe
(spécialisation d’une méthode de la classe mère) ;
- méthodes privées = sous programmes qui sont des outils pour d’autres méthodes de la classe ;
- destructeur (finalisation lors de la destruction de l’objet).
a) Constructeur
-
Méthode qui permet de fixer l’état initial de l’objet (propriétés)
Porte toujours le même nom que la classe ou __construct en PHP5
Appelé directement par PHP lors d’un new.
Permet de définir les valeurs initiales des variables d’instance, d’appeler des méthodes, etc.
Pas de surcharge des méthodes constructeurs = un constructeur par classe, mais on peut donner
des valeurs par défaut à des arguments
On peut appeler une méthode constructeur de la super-classe depuis un constructeur de la classe
fille avec parent::NomConstructeur(arguments) ou parent::__construct
(PHP5). L’appel au constructeur de la super-classe n’est jamais fait automatiquement.
b) Méthode de classe ou méthode d’instance ?
-
-
méthode d’intérêt général pas dépendante d’une instance de la classe  méthode de classe
o l’envoi de message n’est pas destiné à l’instance mais à la classe ($this n’est pas défini)
o manipule uniquement des variables de classe et peut utiliser d’autres méthodes de classe
o ex. méthode qui incrémente ou décrémente le nombre d’humains
méthode d’instance
o manipule des variables d’instance
o ex. méthode qui calcule l’âge d’un humain
c) Finalisation
Méthode appelée juste avant que l’objet soit détruit.
function __destruct(){
parent::__destruct();
}
d) Méthode final ?
Si la méthode est final elle ne pourra pas être redéfinie dans une sous-classe. Les méthodes privées
sont implicitement final.
©Magali Contensin
avril 2006
8/9
e) Méthode abstraite ?
-
Méthode à redéfinir obligatoirement dans les classes dérivées (si une classe contient une méthode
abstraite, elle doit elle-même être abstract).
Ne comporte aucune implémentation = juste une signature : abstract function age();
f) Quelle protection d’accès pour les fonctions membres ?
mot-clé
public
protected
private
visibilité
Appel dans tout le script (par défaut)
Appel depuis la classe ou une classe dérivée
Appel restreint à la classe. La méthode ne sera pas héritée par une sous-classe
7.3 Classes
a) Classe ou classe fille ?
La sous-classe ou classe fille est une spécialisation de la super-classe (classe mère). Une classe fille
comporte toutes les données et méthodes de la classe mère plus les siennes.
b) Classe abstraite ?
-
Aucune instance
Classe en haut de la hiérarchie d’héritage qui définit des comportements et données communs à
toutes les classes.
c) Classe finale ?
Aucune classe ne pourra être dérivée.
La visibilité des classes est publique.
8. Exceptions (PHP 5)
Intercepter toutes les exceptions
try{
// code ou une exception peut etre levee
} catch(Exception $e){
// traitement en cas d'exception
}
Lever une exception
throw expression;
Créer sa classe exception
Class MonException extends Exception
{
public function __construct($message, $code = 0) {}
// traitement specifique
…
parent::__construct($message, $code);
}
©Magali Contensin
avril 2006
9/9