Você está na página 1de 1

Introduction la programmation oriente objet avec le langage PHP

Dfinir une classe Crer un objet Hritage Oprateur :: et parent Dure de vie Les fonctions magiques Conclusion
Bibliographie

Classe, attribut, mthode, constructeur


* PHP nest pas un langage orient objet mais il permet, dans une certaine mesure, la gstion des objets.
* PHP supporte la notion dhritage et permet donc la construction d'une hirarchie de classes et lintroduction du polymorphisme.
* PHP, dans le concept dencapsulation, permet de dfinir un seul niveau de visibilit des lments de la classe : publique.

La dclaration 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 intents et il sera capable de leur allouer un emplacement
mmoire.
<?php
class user {
// proprits
// var Dclaration des variables
var $name;
var $password;
var $last_login;
// mthodes
classe

// constructeur
function user ($inputName, $inputPassword) {
$this->name = $inputName;
$this->password = $inputPassword;
$this->last_login = time();
}
// mthode d'accs
// lire la date de la drnire connexion
function getLastLogin() {
return (Date("M d Y", $this->last_login));
}
}
?>

Mthode (fonction)
Proprit (attribut ou variable)
- Les mthodes quant elles, sont des fonctions
internes l'objet qui vont permette d'agir sur les
attributs de l'objet.

- Les attributs sont des sortes de variables internes l'objet


qui ne sont accessibles qu' travers celui-ci.

- La dclaration d'une mthode (ou fonction)


l'intrieur d'une classe se fait de la mme faon
que dans un script classique. On utilise pour cela
le mot rserv function suivi du nom de la
mthode.

- La dclaration d'un attribut au sein d'une classe se fait par


l'utilisation du mot cl var suivi du nom de l'attribut. (PHP
ne ncessite pas de dclaration pralable des variables, mais,
dans la cadre d'une classe, il est prfrable de la faire.)
- Quand vous dclarez une proprit, vous ne spcifiez
aucun type de donne. Elle pourra contenir, par exemple, un
entier, chane de caractres, un autre objet.

- Si la mthode requiert des paramtres, on les


indiquera entre parenthses. En PHP il n'est pas
ncessaire de spcifier le type de retour de la
fonction.

Une mthode particulire, le constructeur de la classe, est automatiquement appele lors de la cration d'un objet
(instanciation de la classe).Cette mthode permet d'initialiser l'objet sa cration en donnant par exemple des valeurs
chacun de ses attributs. Le constructeur d'une classe est donc une mthode qui porte le mme nom que la classe dont elle est
le constructeur.

Les mthodes disposent d'une variable spciale, this (suivi de l'oprateur -> qui rfrence une classe, une mthode ou une
proprit d'une classe), qui contient l'objet ou l'instance courante. Il faut utiliser cette variable chaque fois qu'on veut nous
rfrer une proprit ou une mthode 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, accder aux proprits et aux mthodes


La cration d'un objet partir d'une classe, s'appelle l'instanciation (un objet tant alors appel instance d'une classe).
La cration d'un objet permet plusieurs choses:
- La cration d'un espace mmoire est rserv pour recevoir toutes les proprits durant son utilisation
- L'atribution d'un nom l'objet.
- En appelant le constructeur, cet objet sera initialis (avec des valeurs par dfaut ou des valeurs passes en paramtres).
- Chaque instance possde son propre jeu de proprits, mais ses mthodes sont communes toutes les instances de cette classe.

Pour la cration d'un objet partir d'une classe il y a quatre manire de gnrer l'objet:
1. Comme dans notre exemple, la variable $currentuser contient l'objet cr avec le mot rserv new suivi du nom de la
classe user. Si le constructeur de la classe ne comporte pas des arguments, il n'est pas ncssaire d'utiliser des
parenthses. En cas contraire placez-les entre parenthses aprs le nom de la classe (comme pour un appel de fonction).
2. Copier un objet par un simple jeu des variables (dans l'exemple ci-dessous $obj2 contient une copie, une nouvelle
instance, susceptible de vivre sa propre vie en n'utilisant pas le constructeur de la classe user).
3. La troisime manire de gnrer l'objet est par infrence, c'est dire par dduction partir du contexte. Vue le fait
que PHP permet de crer des variables $obj3 sans une dclaration pralable on peut crer l'objet par le simple fait
d'utiliser une variable dans un context d'objet (en appliquant l'oprateur -> une variable suffit que cette variable
contienne un objet mme si jamais la classe correspondante n'a t dfinie (pas valable pour ajouter des mthodes !).
4. La dernire manire de gnrer l'objet est par la transformation (casting) d'un tableau associatif. Lorsqu'un tableau
devient un objet, $obj4 , tous les lments du tableau indexs par une chane de caractres deviennent des proprits
(en cas d'indexs par chane vide ils sont cachs pour l'objets).
Pour les objets gnrs par infrence (3) et casting (4) aucune classe n'a t dfinie. Ils apartiennent la classe stdClass du
PHP.
<?php
// cration d'une instance par le mot new
$currentuser = new user ("Dorel", "staf2x");
// cration d'une nouvelle instance par copy
$obj2 = $currentuser;
$obj2 -> commentaire = "ajoutons une proprit";
// cration d'une nouvelle instance par infrence
$obj3 -> age = 25;
$obj3 -> poids= 75;
exemple1

// cration d'une nouvelle instance par casting


$arr['nom'] = "Jean";
$arr['pays'] = "Suisse";
$obj4 = (object) $arr;
print ($obj4->nom); // affiche la proprit nom
// imprimer la date
print ($currentuser->getLastLogin());
// imprimer le nom
print ($currentuser->name);
print ("<br />\n");
?>

Le proprits d'une instance correspondent des variables identiques toutes celles que nous avons vues jusqu' prsent.
- Pour accder aux proprits il faut utiliser l'oprateur ->
- Si un proprit d'objet est elle-mme un objet on peut utiliser deux fois l'oprateur -> dans la mme instruction
(seulement avec la version PHP4)
- la diffrence des langages orients objet (Java, C++) les membres (proprits et mthodes) des classes PHP ne
peuvent tre dclares protected, private ou public (c'est dire que n'importe quelle partie du script on peut y accder
pour lire ou modifier les valeurs qu'elles contient).
L'accs aux mthodes est semblable l'accs aux proprits
- L'oprateur -> est utilis pour indiquer sur quelle instance doit porter la mthode (par exemple l'expression
$currentuser->getLastLogin()).
- Pour ce qui reste, les mthodes se comportent exactement comme des fonctions ordinaires.
<?php
//Objet compos d'autres objets
class chambre {
var $nom;
function chambre ($nom){
//pas de conflit entre les deux "nom"
$this->nom=$nom;
}
}
class maison
{
//une liste des chambres
var $chambres;
}

exemple 2

// crer une maison vide


$home = new maison();
// ajouter des chambres
$home->chambres[] = new chambre (chambre de JJ);
$home->chambres[] = new chambre (chambre de Stek);
$home->chambres[] = new chambre (salle de bains);
// montrer le nom de la premire chambre
print($home->chambres[0]); // on affiche: "chambre de JJ"
?>

Hritage
Le principal apport de la programmation objet est certainement de faciliter la rutilisation (reusability) de modules, en occurrence des
objets. Les deux techniques utilises sont, l'hritage et la composition (un exemple simplifi de composition dans l'exemple 2, en haut).
Ecrire une classe spcialise partir d'une classe gnrale est le meilleur moyen de rutiliser ce code dj produit.
Cette procdure s'appelle hritage et elle est introduite par le mot cl extends.

//
<?php
class myclass {
var $myvar;
function myclass($myparameter) {
$this->myvar = $myparameter;
}
function afficher() {
echo "myvar vaut : $this->myvar";
}
}
?>
p
<?php
class myclass2 extends myclass {
var $myvar2 ;
function myclass2($myparameter, $myparameter2) {
$this->myvar = $myparameter;
$this->myvar2 = $myparameter2;
}

exemple3

function afficher2($color) {
echo "<font color=\"$color\">myvar vaut : $this->myvar</font><br>";
echo "<font color=\"$color\">myvar2 vaut : $this->myvar2</font><br>";
}
}
?>
Dans cet exemple nous venons de dclarer une classe fille myclass2 qui tend la classe mre myclass
prcdemment cre. Dans cette classe, nous avons ajout un attribut myvar2 et une mthode afficher2
($color ) qui ne seront dfinis que dans cette classe. Nous avons galement redfini un constructeur
myclass2($parameter, $parameter2) qui permet d'initialiser les 2 attributs de l'objet lors de sa cration.
//
<?php
$myobject2 = new myclass2(10, 20);
$myobject2->afficher2("red");
$myobject2->afficher();
?>
Ces trois lignes montrent comment utiliser un objet cr partir d'une classe fille. Dans un premier
temps, on cre 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
mthode afficher2($color) dfinie dans mycalss2. La troisime quant elle est plus intressante. En effet,
aucun moment, la mthode afficher() n'apparat dans la classe myclass2. Et pourtant, il est tout fait
possible d'utiliser cette mthode cet endroit car celle-ci a t hrite de la classe mre.
De la mme manire, les attributs des classes mres sont galement accessible dans les classes filles.
Nous avons dj pu le remarquer dans le constructeur de la classe fille myclass2 ou l'on a affect une
valeur l'attribut $myvar qui n'est dfini que dans la classe mre.
$this->myvar = $myparameter;

partir de la version 4, PHP inclut un jeu de douze fonctions de gestion des classes et des instances utiles la POO:
call_user_method_array -- Appelle une mthode utilisateur avec un tableau de paramtres
call_user_method -- Appelle une mthode utilisateur d'un objet
class_exists -- Vrifie qu'une classe a t dfinie
get_class_methods -- Retourne les noms des mthodes d'une classe
get_class_vars -- Retourne les valeurs par dfaut des attributs d'une classe.
get_class -- Retourne la classe d'un objet
get_declared_classes -- Liste toutes les classes dfinies
get_object_vars -- Retourne un tableau associatif des proprits d'un objet
get_parent_class -- Retourne le nom de la classe d'un objet
is_a -- Retourne TRUE si un objet a pour parent une classe donne
is_subclass_of -- Dtermine si un objet est une sous-classe
method_exists -- Vrifie que la mthode existe pour une classe.
Ces fonctions sont disponibles dans le module PHP standard, qui est toujours accessible. Il n'y pas d'installation
ncessaire pour utiliser ces fonctions, elles font parties du coeur de PHP. [ch2.php.net.php]
// Dans cet exemple, on dfinit une classe de base, et une extension.
// La classe de base dfinit un lgume, s'il est mangeable ou pas et
sa couleur.
//La sous-classe epinard ajoute une mthode pour le cuisiner, et une
autre pour savoir s'il est cuisin.
// Exemple 1. Fonctions d'objets : classes.inc
<?php
// classe de base, avec ses membres et ses mthodes
class Legume {
var $edible;
var $color;
function Legume( $edible, $color="green" ) {
$this->edible = $edible;
$this->color = $color;
}
function is_edible() {
return $this->edible;
}
function what_color() {
return $this->color;
}
}
// fin de la classe Legume // Extension la classe de base
class Epinard extends Legume {
var $cuit = FALSE;
function Epinard() {
$this->Legume( TRUE, "green" );
}
function cuisine() {
$this->cuit = TRUE;
}
function is_cooked() {
return $this->cooked;
}
}
// fin de la classe Epinard
?>
// Exemple 2. Fonctions d'objets : test_script.php
<?php
include "classes.inc";
// Fonctions utilitaires

exemple4

function print_vars($obj) {
$arr = get_object_vars($obj);
while (list($prop, $val) = each($arr))
echo "\t$prop = $val\n";
}

function print_methods($obj) {
$arr = get_class_methods(get_class($obj));
foreach ($arr as $method)
echo "\tfonction $method()\n";
}

function class_parentage($obj, $class) {


if (is_subclass_of($GLOBALS[$obj], $class)) {
echo "L'objet $obj appartient la classe ".get_class($$obj);
echo " est une sous-classe de $class\n";
} else {
echo "L'objet $obj n'est pas une sous-classe de $class\n";
}
}

// instantie 2 objets
$veggie = new Legume(true,"blue");
$leafy = new Epinard();

// affiche les informations sur ces objets


echo "lgume : CLASS ".get_class($veggie)."\n";
echo "feuillues : CLASS ".get_class($leafy);
echo ", PARENT ".get_parent_class($leafy)."\n";

// affiche les proprits du lgume


echo "\nlgumes : Proprits\n";
print_vars($veggie);

// et les mthodes des feuillus


echo "\nfeuillus : Mthodes\n";
print_methods($leafy);
echo "\nParente:\n";
class_parentage("leafy", "Epinard");
class_parentage("leafy", "Legume");
?>
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 dernire partie du script va afficher :
[...]
Parente:
L'objet feuilles n'est pas une sous classe epinard
L'objet feuilles est une sous-classe de Legume

Oprateur :: et parent
Nous venons de voir qu'il tait possible de dfinir des classes partir d'autres classes. Dans l'utilisation des objets, il pourra aussi tre utile
de faire appel certaines mthodes 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'oprateur :: qui la manire du ->
pour un objet permettra l'accs aux mthodes travers un nom de classe.

<?php
// exemple d'utilisation du l'oprateur ::
// cration d'une classe simple pour afficher la date
class myDate {
var $day;
var $mounth;
var $year;
function mydate($day, $mounth, $year) {
$this->day = $day;
$this->mounth = $mounth;
$this->year = $year;
}
function printTodayDate() {
echo date("j/m/Y");
}
}
?>
// Nous appelons la mthode printTodayDate() de la classe myDate sans qu'aucun objet de type myDate
ne soit pralablement instanci.
<?php
myDate::printTodayDate();
?>
Une mthode de classe telle que celle-ci ne dois pas faire rfrence aux attributs qui ne seront valoriss
que lors de la cration effective de l'objet.
// exemple comment on utilise le mot rsrv parent
exemple5

//De faon similaire, on peut galement faire appel la mthode de la classe mre d'un objet sans pour
autant tre oblig de crer un objet partir de cette classe mre. Au lieu d'utiliser le nom littral de la
classe de base dans votre code, vous pouvez utiliser le mot rserv parent , qui reprsente votre classe de
base (celle indiqu par extends , dans la dclaration de votre classe).
<?php
class A {
function example() {
echo "Je suis A::example()
base.<br>\n";
}

et

je

fournis

une

fonctionnalit

de

}
//
class B extends A {
function example() {
echo "Je suis B::example()
supplmentaire.<br>\n";
parent::example();
}

et

je

fournis

une

fonctionnalit

}
//
$b = new B;
// Cette syntaxe va appeler B::example(), qui, sont tour, va appeler
A::example().
$b->example();
?>
// Si l'hritage change, vous n'aurez plus qu' modifier le nom de la classe dans la dclaration extends de
votre classe.

Dure de vie des objets, fonctions serialize() et unserialize().


Comme toutes variables en PHP, le dure de vie d'un objet n'excde pas la dure d'excution du script qui le cre. Il faut
transformer notre objet, en une chane de caractres avec la fonction serialize().
La fonction serialize retourne une chane reprsentant une valeur qui peut tre stocke dans les sessions de PHP , ou une base
de donnes et la fonction unserialize() peut relire cette chane pour recrer la valeur originale. La fonction serialize va sauver
toutes les variables d'un objet. Le nom de la classe sera sauv mais par les mthodes de cet objet.
Pour permettre unserialize de lire un objet, la classe de cet objet doit tre dfinie. C'est--dire, si vous avez un objet $a de la
classe A dans une page php1.php, et que vous le linarisez avec serialize , vous obtiendrez une chane qui fait rfrence la
classe A, et contient toutes les valeurs de $a. Pour pouvoir le relire avec la fonction unserialize dans une page page2.php, il
faut que la dfinition de la classe A soit prsente dans cette deuxime page. Cela peut se faire de manire pratique en sauvant
la dfinition de la classe A dans un fichier spar, et en l'incluant dans les deux pages page1.php et page2.php.

// Dfinir la classe A dans un fichier externe classa.inc


<?php
// classa.inc:
class A {
var $one = 1;
function show_one() {
echo $this->one;
}
}
?>
// Crer la page1.php
//page1.php:
<?php
include("classa.inc");

exemple6

$a = new A;
$s = serialize($a);
// enregistrez $s o la page2.php pourra le trouver.
$fp = fopen("store", "w");
fputs($fp, $s);
fclose($fp);
?>
// Crer la page2.php
//page2.php:
<?php
// Ceci est ncessaire pour que unserialize() fonctionne correctement
include("classa.inc");
$s = implode("", @file("store"));
unserialize($s);
// maintenant, utilisez la mthode show_one de l'objet $a.
$a->show_one();
?>

Si vous utilisez les sessions et la fonction session_register pour sauver des objets, ces objets seront linariss
automatiquement avec la fonction serialize la fin de chaque script, et relus avec unserialize au dbut du prochain script.
Cela signifie que ces objets peuvent apparatre dans n'importe quelle page qui utilise vos sessions.
Il est vivement recommand d'inclure la dfinition de classe dans toutes vos pages, mme si vous n'utilisez pas ces classes
dans toutes vos pages. Si vous l'oubliez et qu'un tel objet est prsent, il perdra sa classe, et deviendra un objet de classe
stdClass sans aucune fonction, et donc, plutt inutile.
Si, dans l'exemple ci-dessus, $a devient un objet de session avec l'utilisation de session_register("a") , vous devez pensez
inclure le fichier classa.inc dans toutes vos pages, et pas seulement page1.php et page2.php.

Les fonctions magiques


La fonction serialize() qui transforme les objets en une chane de caractres, le fait de faon trop "brutale"dans certains cas.
En effet, il est possible que vos objets aient ouvert une connexion une base de donnes et ne laient pas encore ferme.
Dans ce cas, il est prfrable (et mme capital) de sassurer que certaines oprations soit effectues avant que lobjet ne soit
effectivement linaris.
La fonction magique __sleep() ferme proprement toute connexion une base de donnes, de valider les requtes, de finaliser
toutes les actions commences. La fonction __sleep() retourne obligatoirement un tableau contenant la liste des attributs
linariser. Cette fonction est aussi pratique si vous avez de trs grands objets qui n'ont pas besoin d'tre sauv entirement.
Cette fonction, doit exister dans lobjet qui sera automatiquement appele par la fonction serialize().
La fonction __wakeup va rtablir toutes les connexions aux bases de donnes, et de recrer les variables qui n'ont pas t
sauves, et, si elle existe, sera automatiquement appele par la fonction unserialize().
a

// Voici un exemple qui montre comment prparer les objets de la classe myclass tre linariss grce
la fonction __sleep() et la fonction _wakeup().

<?php

exemple7

class myclass {
...
function __sleep() {
$this->myvar = 50;
return array('myvar');
}
function __wakeup() {
$this->myvar = 100;
}
}
?>

Conclusion
Les objets sont actuellement l'un des aspects du langage PHP qui concentre le plus l'attention des dveloppeurs du langage. On peut donc
s'attendre dans les prochaines versions de PHP une meilleur intgration et des possibilits encore plus tendues.
La partie thorique de ce cours est prsent termin. J'espre qu'il aura rpondu vos attentes. Si vous observez des erreurs, des
imprcisions ou d'autres fautes, merci de m'en faire part.

Bibliographie
[PHP2002]
[PHP2003]
[Anthology I 2003]
[Anthology II 2003]
[Intclass]
[Doc-PHP-fr]
[Man-PHP-en]
[Library-PHP]
[Tutoriel-1-fr]
[SitePoint]
[Tutoriel-2-fr]
[Intro-class-en]
[Ex-class-fr]

Atkinson L., Programmation en PHP, CampusPress, 2002


Atkinson L., PHP 5, CampusPress, 2003
Fueks Harry, The PHP Anthology, Volume I: Foundations, SitePoint Pty Ltd., 2003
Fueks Harry, The PHP Anthology, Volume II:Applicatons, SitePoint Pty Ltd., 2003
Welcome to the PHP Classes Repository[lien]
Documentation PHP 4.3.3 en Franais[lien]
Manuals at the official PHP site[lien]
A set of PHP classes and library functions[lien]
Cours et tutoriels, outils de dveloppement[lien]
Articles, books, forums to Site Point[lien]
Tutoriels francophones PHP4 et MySQL[lien]
An Introduction to Classes[lien]
Quelques exemples des classes[lien]

Você também pode gostar