Programmation orientée objet php 5

Ouvrage

Micro Application Référence

N. Borde A; MarhinM. Thévenet

PHP 5

2004

isbn : 2-7429-3217-8

S’il avait souvent été reproché à la version 4 de Php de n'avoir implémenté les concepts de la programmation objet qu'à moitié, Php 5 ne souffrira certainement pas des mêmes reproches. Le nouveau moteur Zend offre toutes les possibilités d'un langage de programmation orienté objet moderne: classes, héritage, constructeurs, destructeurs, tout est là.

Nous commencerons notre étude par un rappel sur ce qu'est la programmation objet, puis nous expliquerons comment la mettre en oeuvre en Php.

La programmation orientée objet

Php dans ses versions antérieures à la version 4, ne proposait pas la possibilité d’utiliser des classes. Le programmeur devait donc se débrouiller pour organiser des fonctions de la manière la plus propre possible, en essayant de les faire communiquer entre elles et de leur faire partager des données sans pour autant rendre le code incompréhensible. La majeure partie des scripts restait lisible, mais force est d'avouer que par rapport à des langages objet comme C++ ou Java, Php faisait figure de langage "brouillon" avec lequel il était très difficile de développer du code réutilisable et maintenable facilement. De plus, la création d'applications complexes devenait vite un véritable casse‑tête.

La programmation orientée objet est née de ce genre de constat, d'abord en 1972, avec SmallTalk, mais surtout en 1983, lorsque Bjarn Stroustrup mit au point une extension orientée objet du C : le C++. Depuis, les maîtres mots en matière de programmation sont réutilisabilité et facilité de maintenance. Le code doit être organisé de façon claire et logique de manière à atteindre ces deux objectifs. La programmation objet fournit justement un cadre idéal à ce genre de réalisations, car elle permet une meilleure conceptualisation, elle rend le principe de fonctionnement d'un programme plus "humain" en permettant de s'abstraire totalement du code pour s'atteler à la tâche principale : trouver la solution à un problème.

La notion d'objet

Imaginons que nous souhaitions simuler un zoo et, plus précisément, le moment où le gardien vient nourrir chaque animal. Nous voulons que chaque animal lance son cri lorsque le gardien le nourrit (le lion va rugir, le mouton bêler, etc.), et nous voulons également que le gardien donne le bon type de nourriture à chaque animal. Ici, nous sommes en présence de deux objets: un gardien et un animal. Chacun des deux sera défini par ses caractéristiques propres et par les actions qu'il peut effectuer. Les caractéristiques du gardien seront par exemple son nom et son prénom, et celles de l'animal duquel il s'approche seront son "type" (lion, koala), son nom et la nourriture qu'il consomme. Au niveau des actions, le gardien peut nourrir un animal et l'animal peut émettre son cri.

Voyons à présent d'un point de vue plus technique de quoi se compose un objet.

Comme nous l'avons dit, un objet regroupe toutes les informations et actions disponibles pour une entité donnée. Les informations, que nous appelons indifféremment "attributs". "champs", "propriétés" ou encore "membres", sont matérialisées par des variables, tandis que les actions, que nous appelons "méthodes", sont matérialisées par des fonctions. Voici en pseudo Php à quoi ressemblerait la classe correspondant à notre objet animal

<?php

class Animal

{

// les trois caractéristiques d'un animal : son type,

// son nom et ce qu'il mange

$type;

$nourriture;

$nom

// l'action que l'animal peut effectuer : émettre un son

function emettreSon( ) { };

}

?>

Et notre objet gardien serait la classe suivante

<?php

class Gardien

{

// les deux caractéristiques du gardien, son nom et son prénom $nom;

$prenom;

// l'action que le gardien peut effectuer : nourrir un animal function nourrir($animal) { };

}

?>

Comme vous pouvez le voir, nous nous sommes contentés de transposer en pseudocode ce que nous avions énoncé par des phrases.

Voyons à présent comment écrire ces classes en Php.

La définition d'une classe

la définition d'une classe démarre toujours par le mot clé class suivi du nom de la classe. Ensuite, nous écrivons entre accolades les listes des variables membres et celle des méthodes, (l'ordre n'a aucune importance), de la même façon que nous définirions des variables et des fonctions dans une programmation classique. Nos classes deviennent donc

< ?php

class Animal

{

// les trois caractéristiques d’un animal

public $type ;

public $nourriture;

public Snom;

// l'action que l'animal peut effectuer

fonction emettreSon()

{

print("Le $this‑>type pousse son cri !<br/>");

}

}

class Gardien

// les deux caractéristiques du gardien

public $nom;

public $prenom;

// l'action que le gardien peut effectuer

function nourrir($animal)

{

print("Le gardien donne de la $animal‑>nourriture"

. "au $animal->type.<br/>") ;

}

}

?>

Le code n'a quasiment pas changé par rapport à ce que nous avions défini précédemment : il ne manquerait que le code dess méthodes et le mot clé public devant les déclarations de variables.

La méthode Gardien::nourrir (raccourci pour dire « la méthode nourrir de l’objet Gardien »)prend une variable nommée $animal en paramètre. Vous vous en doutez, il s'agira d'un objet de type Animal. Dans la méthode, nous accédons aux variables membres de cette classe grâce à la flèche (le "‑>" dans "$animal‑>type". Cette même flèche sert, d’une façon plus générale, à accéder à tout ce qui est disponible dans un classe, variables et méthodes.

A l’intérieur d'une classe. les variables sont accessibles glace à la flèche et au mot clé $this qui référence, à l'intérieur de la classe, l'instance courante. Autrement dit, si nous voulions ajouter à la classe Gardien une méthode affichant son nom et son prénom, nous écririons

function afficherNom()

{

print (‘Bonjour, je m'appelle $this ->prenom $this->nom’) ;

}

Revenons un instant sur le mot clé public. Il indique la visibilité de la variable. En effet, dans un objet, il est possible de spécifier qui pourra accéder à quelles variables. II existe trois niveaux de visibilité, symbolisés par trots mots clés :

public : indique que la variable est publique. Dans ce cas, la variable est directement accessible de l'extérieur de la classe.

private : indique que la variable est privée. Dans ce cas, la variable n'est accessible qu'à l'intérieur de la classe, Si vous souhaiter y accéder de l'extérieur, il faudra écrire une méthode qui la retourne.

protected : cette visibilité se situe entre privée et publique. Dans ce cas. la variable ne sera pas accessible de l’extérieur de la classe. sauf pour les classes filles qui hériteront de ce champ comme champ privé.

Maintenant que nous connaissons la notion de visibilité, modifions nos classes afin de leur faire encapsuler leurs données correctement

< ?php

class Animal

{

// les trois caractéristiques d'un animal private $type;

private $nourriture;

private $nom;

// l'action que l'animal peut effectuer

function emettreSon()

{

print (‘Le $this‑>type pousse son cri !<br/>');

}

function getType() {return $this‑>type};

function getNourriture() {return $this‑>nourriture}; function getNom() {return $this‑>nom};

}

class Gardien

// les deux caractéristiques du gardien, son nom et son prénom

private $nom;

private $prenom;

// l'action que le gardien peut effectuer : nourrir un animal function nourrir($animal)

{

print(‘Le gardien donne de la ".$animal‑>getNourriture()

.’au’.$animal‑>getType().’ ‘.$animal‑>getNom().’.<br/>’); $animal‑>emettreSon();

}

}

Nous avons passé, comme le veut le principe d'encapsulation (= aucune variable membre doit être publique) , toutes nos variables membres en privé, et nous avons écrit les méthodes nécessaires à leur accès.

Nos classes étant déclarées, voyons maintenant comment nous en servir.

Les objets naissent

Pour utiliser une classe. il faut la créer grâce à l'opérateur new (il s'agit "d'instanciation" d'une classe)

< ?php

$animal = new Animal( ) ;

?>

Un problème se pose : nous souhaitons indiquer quels sont le nom et la race de l'animal et quelle nourriture il mange. Nous pourrions écrire des mutateurs ( = méthode permettant de changer la valeur d’un champ privé) pour donner des valeurs, aux champs privés de la classe après son instanciation, mais cela serait assez lourd d'emploi. Il serait, en revanche, intéressant de pouvoir passer ces valeurs en paramètre lors de la création de l'objet. autrement dit de pouvoir écrire,

<?php $animal = new Animal(" lion", "tony", "viande'') ;

?>

C’est justement ce que permettent les constructeurs. Un constructeur est une méthode spéciale qui est appelée lors de la création de la classe avec new. Afin d’être reconnu, le constructeur est affublé d'un nom spécial : construct. Nous allons, donc pouvoir écrire cette méthode de façon;à ce qu’elle assigne les valeurs passées en paramètres aux variables membres

< ?php

class Animal

{

//les trois caractéristiques d’un animal

private $type ;

private $nourriture;

private $nom;

// le constructeur de notre classe

fonction -construct($type, $nom, $nourriture)

{

$this->type = $type;

$this->nom = $nom;

$this->nourriture = $nourriture;

}

//l’action que l’animal peut effectuer

function emettreSon()

{

print("Le $this‑>type pousse son cri !<br/>");

}

function getType() {return $this‑>type};

function getNourriture() {return $this‑>nourriture};

function getNom() {return $this‑>nom};

}

?>

Le constructeur permet d'effectuer toutes les opérations nécessaires à l'initialisation de la classe avant son utilisation.

Nous poupons, à présent, écrire un petit programme utilisant ces classes.

< ?php

$g = new Gardien();

$a = new Animal("lion", "tony", "viande");

5g‑>nourrir($a) ;

?>

L'affichage produit sera le suivant

Le gardien donne de la viande au lion tony,

Le lion pousse son cri .

Nous réalisons l’initialisation des variables membres dans le constructeur, mais sachez qu'une valeur par défaut peut leur être donnée lors de leur déclaration, par exemple

Class Gardien

{

//nous donnons des valeurs par défaut private $nom = 'Thergal";

private $prenom = "Jean‑Claude";

//	l'action que le gardien peut effectuer : nourrir un animal

function nourrir($animal)

Print("Le gardien donne de la ",$animal‑>getNourriture()

. " au ".$animal ->getType()." ".$animal‑>getNom()."<br/");

$animal-> emettreSon() ;

}

}

?>

03/14/05	Php programmation orientée objet	5/7

S’il avait souvent été reproché à la version 4 de Php de n'avoi

Administrateur

2005-03-14T21:52:00

Alain Dallo