Collection d'objet avec PHP
Date de publication : 25 septembre 2010
Par
Sony NOËL
Dans le dictionnaire, le mot collection signifie réunion d'objets de même type.
L'une des problématiques, c'est de pouvoir manipuler un ensemble d'objets de même classe sans trop savoir comment pouvoir les manipuler ensemble ou séparément.
C'est clairement ce dont nous allons expliquer dans cet article.
I. Cas d'étude
Tableau d'objets
I. Cas d'étude
Afin de bien comprendre le sujet, nous allons prendre un exemple assez simple.
Nous allons le schématiser dans une base de données avec MySQL et classe PHP.
Un responsable d'établissement scolaire a besoin d'avoir une vue de ses élèves dans son établissement.
Nous allons décomposer les éléments ainsi : Établissement, Salle, Élève.
Etablissement scolaire coté SQL (MySQL) |
CREATE TABLE `etablissement` (
`idEtablissement` INTEGER (11 ) NOT NULL ,
`Nom` VARCHAR (250 ) NOT NULL ,
PRIMARY KEY (`idEtablissement`)
);
CREATE TABLE `Salle` (
`idSalle` INTEGER (11 ) NOT NULL ,
`idEtablissement` INTEGER (11 ) NOT NULL
`Nom` VARCHAR (250 ) NOT NULL ,
PRIMARY KEY (`idSalle`)
);
CREATE TABLE `eleve` (
`idEleve` INTEGER (11 ) NOT NULL AUTO_INCREMENT,
`Nom` VARCHAR (250 ) NOT NULL ,
`idSalle` INTEGER (11 ) DEFAULT NULL ,
PRIMARY KEY (`idEleve`)
);
INSERT INTO `etablissement` (idEtablissement,Nom) VALUES (1 ,' Etablissement Claude Chabrol ' );
INSERT INTO `salle` (idSalle,Nom,idEtablissement) VALUES (1 ,' Louis de Funès ' ,1 );
INSERT INTO `salle` (idSalle,Nom,idEtablissement) VALUES (2 ,' Lino Ventura ' ,1 );
INSERT INTO `salle` (idSalle,Nom,idEtablissement) VALUES (3 ,' Romy Schneider ' ,1 );
INSERT INTO `eleve` (Nom,idSalle) VALUES (' Tom Loda ' ,1 );
INSERT INTO `eleve` (Nom,idSalle) VALUES (' Severine Leroy ' ,1 );
INSERT INTO `eleve` (Nom,idSalle) VALUES (' Tahanie Sima ' ,1 );
INSERT INTO `eleve` (Nom,idSalle) VALUES (' Sensuk Coche ' ,2 );
INSERT INTO `eleve` (Nom,idSalle) VALUES (' Raoul Lemalin ' ,2 );
INSERT INTO `eleve` (Nom,idSalle) VALUES (' Ursuline Sec ' ,2 );
INSERT INTO `eleve` (Nom,idSalle) VALUES (' Ulrica Saison ' ,3 );
INSERT INTO `eleve` (Nom,idSalle) VALUES (' Pandore Rache ' ,3 );
INSERT INTO `eleve` (Nom,idSalle) VALUES (' Zéphyrin Yakamoto ' ,3 );
|
Pour les classe, nous allons commencer avec 3 simple.
Nous allons la compléter par la suite.
classe |
classe Etablissement{
private $ idEtablissement ;
private $ Nom ;
function __construct (){
$this ->idEtablissement = null ;
$this ->Nom = null ;
}
public function setID($ p_id ){
$this ->idEtablissement = $ p_id ;
}
public function getID(){
return $this ->idEtablissment ;
}
public function setNom($ p_nom ){
$this ->Nom = $ p_nom ;
}
public function getNom(){
return $this ->Nom ;
}
}
classe Salle{
private $ idSalle ;
private $ Nom ;
function __construct (){
$this ->idSalle = null ;
$this ->Nom = null ;
}
public function setID($ p_id ){
$this ->idSalle = $ p_id ;
}
public function getID(){
return $this ->idSalle ;
}
public function setNom($ p_nom ){
$this ->Nom = $ p_nom ;
}
public function getNom(){
return $this ->Nom ;
}
}
classe Eleve{
private $ idEleve ;
private $ Nom ;
function __construct (){
$this ->idEleve = null ;
$this ->Nom = null ;
}
public function setID($ p_id ){
$this ->idEleve = $ p_id ;
}
public function getID(){
return $this ->idEleve ;
}
public function setNom($ p_nom ){
$this ->Nom = $ p_nom ;
}
public function getNom(){
return $this ->Nom ;
}
}
|
Tableau d'objets
Comment matérialiser le faite qu'un établissement puisse avoir plusieurs salles
et que dans une salle il y ait plusieurs élèves ?
En gros, comment dans un objet pouvons-nous avoir plusieurs objets exploitables indépendamment ?
Dans d'autres langages tels que .NET ou Java, il existe des mécanismes permettant de gérer cela,
Mais avec PHP, aucun mécanisme ne permet de gérer ce cas nativement.
Pour contre, ce qui est possible c'est d'utiliser un tableau (array).
En effet, il est possible de placer un objet dans un tableau comme présenté ci-dessous.
Exemple simple |
class MaClasse{ } ;
$ arrObj = array ();
$ arrObj [ 0 ] = new MaClasse();
$ arrObj [ 1 ] = new MaClasse();
$ arrObj [ 2 ] = new MaClasse();
print_r($ arrObj );
|
Si nous regardons en détail la variable $arrObj, voici ce qui est affiché.
Array(
[0] => MaClasse Object
(
)
[1] => MaClasse Object
(
)
[2] => MaClasse Object
(
)
)
|
La variable $arrObj contient plusieurs instance de la classe MaClasse
et ces instances sont totalement indépendante de l'une de l'autre.
Maintenant, nous allons utiliser notre exemple avec l'établissement scolaire en y intégrant
une relation avec la base de données.
Chargement de l'établissement |
$ DbLink = mysqli_connect(" VotreServeur " , " VotreIdentifiant " , " MotDePasse " , " votre base " );
$ arrObjEtablissement = array ();
$ i = 0;
$ rs = mysqli_query($ DbLink , " SELECT idEtablissement , Nom FROM ` etablissement ` " );
while ($ dataEtablissement = mysqli_fetch_array($ rs )){
$ObjEtablissement = new Etablissement();
$ObjEtablissement ->setID ($ dataEtablissement [ " idEtablissement " ] );
$ObjEtablissement ->setNom ($ dataEtablissement [ " Nom " ] );
arrObjEtablissement[ $ i ] = $ ObjEtablissement ;
$ i + + ;
}
|
Dans la base de données, nous n'avons qu'un seul établissement, mais celui-ci contient plusieurs salles.
Nous allons donc modifier la classe Établissement afin qu'elle puisse contenir ces salles.
Classe [Etablissement] |
class Etablissement{
private $ idEtablissement ;
private $ Nom ;
private $ arrObjSalle ;
private $ LkDb ;
function __construct ($ p_LkDb ){
$this ->idEtablissement = null ;
$this ->Nom = null ;
$this ->arrObjSalle = array ();
$this ->LkDb = $ p_LkDb ;
}
function __destruct (){
$this ->idEtablissement = null ;
$this ->Nom = null ;
$this ->arrObjSalle = null ;
$this ->LkDb = null ;
}
private function setArrObjSalle(array $ p_arrObjSalle ){
$this ->arrObjSalle = $ p_arrObjSalle ;
}
public function getArrObjSalle(){
return $this ->arrObjSalle ;
}
public function getSalleByEtablissement(){
if (! is_null($this ->getID ())){
$ i = 0 ;
$ arrObjSalle = array ();
$ res = mysqli_query($this ->LkDb , " SELECT idSalle , Nom FROM salle WHERE idEtablissement = " . $this ->getID ());
while ($ dataSalle = mysqli_fetch_array($ res )){
$objSalle = new Salle($this ->LkDb );
$objSalle ->setID ($ dataSalle [ " idSalle " ] );
$objSalle ->setNom ($ dataSalle [ " Nom " ] );
$ arrObjSalle [ $ i ] = $ objSalle ;
$ i + + ;
}
$this ->setArrObjSalle ($ arrObjSalle );
return true ;
}
return false ;
}
public function setID($ p_id ){
$this ->idEtablissement = $ p_id ;
}
public function getID(){
return $this ->idEtablissement ;
}
public function setNom($ p_nom ){
$this ->Nom = $ p_nom ;
}
public function getNom(){
return $this ->Nom ;
}
}
|
Dans le code ci-dessous, il a quelques méthodes qui y ont été ajoutées.
setArrObjSalle(array $p_arrObjSalle)
Cette méthode est un accesseur à la propriété privée "arrObjSalle".
Si vous remarquez, le paramètre de cet accesseur est déclaré comme étant un array, ceci est nouveauté de PHP 5.x.
En effet, avec cette version de PHP vous pouvez déclarer des variables de type objet (le nom de votre objet) ainsi que le type Array.
Les autres types tels que String, Integer, Float... ne sont pas acceptés.
getArrObjSalle
Cette méthode permet de retourner la collection d'objets Salle
getSalleByEtablissement()
Cette méthode permet de récupérer les salles associées à l'établissement courant.
S'il y avait plusieurs établissements, en appelant cette méthode vous récupérez que les salles
associées à son établissement. Pas de risque d'interaction avec les autres établissements.
Maintenant, que se passe t-il lorsque nous exploitons cette classe ?
Utilisation de la classe Etablissement |
$ DbLink = mysqli_connect(" VotreServeur " , " VotreIdentifiant " , " MotDePasse " , " votre base " );
$objEtablissement = new Etablissement($ DbLink );
$objEtablissement ->setID (1 );
$objEtablissement ->getSallebyEtablissement ();
print_r($objEtablissement ->getArrObjSalle ());
Array
(
[ 0 ] = > Salle Object
(
[ idSalle: Salle: private ] = > 1
[ Nom: Salle: private ] = > Louis de Funès
)
[ 1 ] = > Salle Object
(
[ idSalle: Salle: private ] = > 2
[ Nom: Salle: private ] = > Lino Ventura
)
[ 2 ] = > Salle Object
(
[ idSalle: Salle: private ] = > 3
[ Nom: Salle: private ] = > Romy Schneider
)
)
|