Avec PHP, on programme comme on
veut…et même en objet si on le désire. Attention, PHP n’étant pas à la
base un langage de programmation objet, il ne supporte pas tous les
concepts inhérents à ce style/philosophie de programmation. Néanmoins,
l’utilisation de classes bien définies permettra aux utilisateurs
d’exploiter au mieux les fonctionnalités déjà développées.
13.1 Syntaxe de la programmation objet
La syntaxe est fortement inspirée du C++.
13.1.1 Allocation d’un objet
Tout
se passe comme une allocation classique en C++, la seule différence est
que l’on retrouve l’éternel $ propre au PHP et langage de scripts en
général.
$monObjet = new maClasse(paramètres éventuels du constructeur) ;
13.1.2 Accès aux méthodes et attributs
$monObjet->nomMethode(…) ; $monObjet->nomAttribut = … ou $mavar = $monObjet->nomAttribut |
On
fera attention à mettre le $ sur le nom de l’objet et pas sur le nom de
la méthode/attribut. Lorsqu’on désirera affecter un attribut relatif à
soi-même (le this), on procédera de la même manière : $this->… PHP n’ayant pas de déclaration préalable des variables nécessaires, l’oubli de $this-> ne provoquera pas d’erreur, une nouvelle variable sera ainsi définie et utilisée, mais ce ne sera pas l’attribut de la classe.
13.1.3 Définition d’une méthode
function maMethode([$param1, $param2) { return $… // permet à la méthode de faire un retour de “ ce que l’on veut ” } |
13.1.4 Déclaration d’une classe
class MaClasse {
$attribut1 ;
$attribut2 ;
function maMethode1( ) {
…
}
function maMethode2($param1, $param2= “ je suis une chaîne ”) { // paramètre par défaut…
…
}
} // fin de la déclaration de la classe.
Par
défaut, tout accès à un membre (attribut/méthode) est public.
Néanmoins, il est tout à fait possible d'y préciser un accès de type private ou protected en plaçant le mot clé devant la déclaration de l'attribut et/ou de la méthode.
Communément, les fichier de déclaration comporteront l’extension .inc (pour include). Afin de ne pas surcharger le code, et dans un but de réutilisation maximum, nous inclurons le code via la commande include(“ maclasse.inc ”) dans le fichier PHP exploitant cette dernière. On procédera ainsi :
< ?php
include (“ maClasse.inc ”) ;
?>
<HTML> <HEAD> …</HEAD> <BODY>
< ?php
$monObjet = new maClasse(…) ;
?>
</BODY></HTML>
13.1.5 Autres concepts
L'héritage
et oui, et c’est souhaitable, il est également possible de profiter des
avantages de l’héritage, mais contrairement au C++ ou SmallTalk, PHP
utilise la philosophie chère à Java en n'autorisant quel'héritage simple (pas d'héritage multiple) :
class maClasseHéritée extends maClasse {
…
parent::methode1() // permet d'appeler la méthode ''originale'' de la classe mère
}
La surdéfinition d'attributs et de méthodes est également possible à la condition que le membre concerné n'ai pas été déclaré
final ( final mamethode (...) ),Afin de palier en partie aux problèmes liés à l'inexistence d'héritage multiple, PHP permet de définier des
interfaces. Une Interface permet de spécifier le squelette d'une classe qui sera implémentée dans les classes implémentant l'interface :
interface AffichezMoi {
function afficher();
}
class maClasseAMoi implements AffichezMoi {
function afficher() {
//implémentation de la méthode de l'interface
}
...// Attention, il ne faut pas implémenter uniquement les méthodes de l'interaface.
}
Nous
avons ici une classe qui implémente (ce qui n'est pas exclusif avec
l'héritage) une classe dont elle contiendra le code. Ceci permet de
créer des modèles de classes en délocalisant l'implémentation à la
classe qui la nécessite afin que l'implémentation « colle » au mieux
aux besoins.
Lors de l'utilisation de classes, il est à noter
une fonction bien pratique (également présente en Java par exemple) qui
permet de connaître la classe d'un objet et donc de réaliser des
traitement particuliers :
if ($o1 instanceof ClasseA)
...
else
...
Également présent la possibilité de créer une copie d'un objet à l'aide du mot clé clone :
$copie = clone $objet;
Enfin,
il est également possible d'utiliser la réflexivité sur les classes
afin d'interroger les classes et objets pour en connaître leur
structure et contenu. Cette API complète ne sera pas décrite, on pourra
consulter labibliographie pour plus d'informations.