Classe, attribut, méthode, constructeur
- * PHP n’est pas un langage orienté objet mais il permet, dans une certaine mesure, la géstion des objets.
- * PHP supporte la notion d’héritage et permet donc la construction d'une hiérarchie de classes et l’introduction du polymorphisme.
- * PHP, dans le concept d’encapsulation, permet de définir un seul niveau de visibilité des éléments de la classe : publique.
La déclaration d'une classe se fait par l'utilisation du mot clé class, suivit du nom de la classe. A partir de ce point, le moteur PHP sait que des objets de type user (voir le code) pourront être intentés et il sera capable de leur allouer un emplacement mémoire. |
classe |
|
|
|
|
|
Une méthode particulière, le
constructeur de la classe, est automatiquement appelée
lors de la création d'un objet (instanciation de la classe).Cette
méthode permet d'initialiser l'objet à sa création
en donnant par exemple des valeurs à chacun de ses attributs.
Le constructeur d'une classe est donc une méthode qui porte
le même nom que la classe
dont elle est le constructeur.
|
||
Les méthodes disposent
d'une variable spéciale, this
(suivi de l'opérateur ->
qui référence une classe, une mèthode ou une
propriété d'une classe), qui contient l'objet ou l'instance
courante. Il faut utiliser cette variable chaque fois qu'on veut
nous référer à une propriété
ou à une méthode de l'objet. PHP supposera qu'il s'agit
d'une variable locale (voir l'usage de this au sein du constructeur
de la classe user et la fonction
d'affichage getLastLogin). |
Instanciation, accéder aux propriétés
et aux méthodes
- La création d'un objet à partir d'une classe, s'appelle l'instanciation (un objet étant alors appelé instance d'une classe).
- La création d'un objet permet plusieurs choses:
- - La création d'un espace mémoire est réservé pour recevoir toutes les propriétés durant son utilisation
- - L'atribution d'un nom à l'objet.
- - En appelant le constructeur, cet objet sera initialisé (avec des valeurs par défaut ou des valeurs passées en paramètres).
- - Chaque instance possède son propre jeu de propriétés, mais ses méthodes sont communes à toutes les instances de cette classe.
|
exemple1 |
|
|
|
exemple 2 |
<?php |
|
Héritage
- Le principal apport de la programmation objet est certainement de faciliter la réutilisation (reusability) de modules, en occurrence des objets. Les deux techniques utilisées sont, l'héritage et la composition (un exemple simplifié de composition dans l'exemple 2, en haut).
- Ecrire une classe spécialisée à partir d'une classe générale est le meilleur moyen de réutiliser ce code déjà produit.
- Cette procédure s'appelle héritage et elle est introduite par le mot clé extends.
exemple3 |
//p
Dans cet exemple nous venons de déclarer une classe fille myclass2 qui étend la classe mère myclass précédemment créée. Dans cette classe, nous avons ajouté un attribut myvar2 et une méthode afficher2($color ) qui ne seront définis que dans cette classe. Nous avons également redéfini un constructeur myclass2($parameter, $parameter2) qui permet d'initialiser les 2 attributs de l'objet lors de sa création. // Ces trois lignes montrent comment utiliser un objet créé à partir d'une classe fille. Dans un premier temps, on crée une instance de la classe myclass2 que l'on stocke dans un objet nommé $myobject2, en attribuant les valeurs 10 et 20 aux attributs $myvar et $myvar2 . Puis on fait simplement appel à la méthode afficher2($color) définie dans mycalss2. La troisième quant à elle est plus intéressante. En effet, à aucun moment, la méthode afficher() n'apparaît dans la classe myclass2. Et pourtant, il est tout à fait possible d'utiliser cette méthode à cet endroit car celle-ci a été héritée de la classe mère. De la même manière, les attributs des classes mères sont également accessible dans les classes filles. Nous avons déjà pu le remarquer dans le constructeur de la classe fille myclass2 ou l'on a affecté une valeur à l'attribut $myvar qui n'est défini que dans la classe mère. $this->myvar = $myparameter; |
|
|
exemple4 |
// Dans cet exemple, on définit
une classe de base, et une extension.
Il est important de noter que dans les exemples ci-dessus, les objets $feuilles sont une instance de Epinard qui est une sous-classe de Legume, donc la dernière partie du script va afficher :
[...] |
|
Opérateur :: et parent
- Nous venons de voir qu'il était possible de définir des classes à partir d'autres classes. Dans l'utilisation des objets, il pourra aussi être utile de faire appel à certaines méthodes de certaines classes sans avoir la contrainte que l'objet de cette classe soit créé auparavant..

- Dans sa version 4, PHP permet d'effectuer ce genre de traitement sur des classes. On utilisera alors l'opérateur :: qui à la manière du -> pour un objet permettra l'accès aux méthodes à travers un nom de classe.

exemple5 |
<?php
// Nous appelons la méthode printTodayDate() de la classe myDate sans qu'aucun objet de type myDate ne soit préalablement instancié.
Une méthode de classe telle que celle-ci ne dois pas faire référence aux attributs qui ne seront valorisés que lors de la création effective de l'objet.
//De façon similaire, on peut également faire appel à la méthode de la classe mère d'un objet sans pour autant être obligé de créer un objet à partir de cette classe mère. Au lieu d'utiliser le nom littéral de la classe de base dans votre code, vous pouvez utiliser le mot réservé parent , qui représente votre classe de base (celle indiqué par extends , dans la déclaration de votre classe). <?php // Si l'héritage change, vous n'aurez plus qu'à modifier le nom de la classe dans la déclaration extends de votre classe. |
|
Durée de vie des objets, fonctions serialize()
et unserialize().
|
exemple6 |
// Définir la classe A dans un fichier externe classa.inc <?php
// Créer la page1.php
//page1.php:
// Créer la page2.php
//page2.php:
|
|
|
Les
fonctions magiques
|
exemple7 |
// Voici un exemple qui montre comment préparer les objets de la classe myclass à être linéarisés grâce à la fonction __sleep() et la fonction _wakeup(). <?php
|
|
Conclusion
- Les objets sont actuellement l'un des aspects du langage PHP qui concentre le plus l'attention des développeurs du langage. On peut donc s'attendre dans les prochaines versions de PHP à une meilleur intégration et des possibilités encore plus étendues.

- La partie théorique de ce cours est à présent
terminé. J'espère qu'il aura répondu à
vos attentes. Si vous observez des erreurs, des imprécisions
ou d'autres fautes, merci de m'en faire part.

Bibliographie
| [PHP2002] | Atkinson L., Programmation en PHP, CampusPress, 2002 |
| [PHP2003] | Atkinson L., PHP 5, CampusPress, 2003 |
| [Anthology I 2003] | Fueks Harry, The PHP Anthology, Volume I: Foundations, SitePoint Pty Ltd., 2003 |
| [Anthology II 2003] | Fueks Harry, The PHP Anthology, Volume II:Applicatons, SitePoint Pty Ltd., 2003 |
| [Intclass] | Welcome to the PHP Classes Repository[lien] |
| [Doc-PHP-fr] | Documentation PHP 4.3.3 en Français[lien] |
| [Man-PHP-en] | Manuals at the official PHP site[lien] |
| [Library-PHP] | A set of PHP classes and library functions[lien] | [Tutoriel-1-fr] | Cours et tutoriels, outils de développement[lien] | [SitePoint] | Articles, books, forums to Site Point[lien] | [Tutoriel-2-fr] | Tutoriels francophones PHP4 et MySQL[lien] | [Intro-class-en] | An Introduction to Classes[lien] | [Ex-class-fr] | Quelques exemples des classes[lien] |