Developpez.com - PHP
X

Choisissez d'abord la catégorieensuite la rubrique :


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.

       Version PDF (Miroir)   Version hors-ligne (Miroir)
Viadeo Twitter Facebook Share on Google+        



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`)
);

-- L'établissment		
INSERT INTO `etablissement` (idEtablissement,Nom) VALUES (1,'Etablissement Claude Chabrol');
--Les salles
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);

-- Les élèves
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; //Place l'objet dans le tableau.
	$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();
			
			//Nous récupérons les salles faisant partie de l'établissement en utilisant l'id déjà présent dans l'objet courant.
			$res = mysqli_query($this->LkDb,"SELECT idSalle,Nom FROM salle WHERE idEtablissement = ".$this->getID());

			//Mise en place de la collection de salle dans l'établissement.
			while($dataSalle = mysqli_fetch_array($res)){
				$objSalle = new Salle($this->LkDb); //Nous instancions la classe pour chaque itération.
				//Nous chargeons les données dans l'objet "Salle" pour l'itération courante.
				$objSalle->setID($dataSalle["idSalle"]);
				$objSalle->setNom($dataSalle["Nom"]);
				
				//Nous plaçons l'objet de l'itération courante dans une clé du tableau.			
				$arrObjSalle[$i] = $objSalle;
				$i++;
			}
			//Une fois que l'itération terminé le tableau est placé dans l'attribut "arrObjSalle" via son accesseur "setArrObjSalle"
			$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); //Nous plaçons en dure l'identifiant existant dans la base de données.
$objEtablissement->getSallebyEtablissement();
print_r($objEtablissement->getArrObjSalle());

//Ceci affichera 
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
        )
)


               Version PDF (Miroir)   Version hors-ligne (Miroir)

Valid XHTML 1.0 TransitionalValid CSS!

Contacter le responsable de la rubrique PHP