BDD et POO
La programmation orientée objet en PHP : gestion de BDD en POO
Manipuler les données stockées
Vous utilisiez jusqu'à présent des tableaux pour manipuler les données stockées en base de données. Exemple<?php
// On admet que $db est un objet PDO
$request = $db->query('SELECT id, nom, forcePerso, degats, niveau, experience FROM personnages');
while ($perso = $request->fetch(PDO::FETCH_ASSOC)) {
echo $perso['nom'], ' a ', $perso['forcePerso'], ' de force, ', $perso['degats'], ' de dégâts, ', $perso['experience'], ' d\'expérience et est au niveau ', $perso['niveau'];
}
Maintenant, puisque nous programmons de manière orientée objet, nous voulons travailler seulement avec des objets (c'est le principe même de la POO, rappelons-le) et non plus avec des tableaux. En d'autres termes, il va falloir transformer le tableau que l'on reçoit en objet.
Travailler avec des objets
Avant de travailler avec des objets, encore faut-il savoir de quelle classe ils sont issus. Dans notre cas, nous voulons des objets représentant des personnages. On aura donc besoin d'une classe Personnage!Les attributs de notre classe (les caractéristiques) nous sont offerts sur un plateau ! Ce sont les colonnes de la base de données (ou du tableau PHP) :
<?php
class Personnage {
private $_id;
private $_nom;
private $_forcePerso;
private $_degats;
private $_niveau;
private $_experience;
}
Getters et setters
Il faut bien sûr implémenter (écrire) les getters et setters qui nous permettront d'accéder et de modifier les valeurs de notre objet. Pour rappel, un getter est une méthode chargée de renvoyer la valeur d'un attribut, tandis qu'un setter est une méthode chargée d'assigner une valeur à un attribut en vérifiant son intégrité (si vous assignez la valeur sans aucun contrôle, vous perdez tout l'intérêt qu'apporte le principe d'encapsulation).Voici donc ce que donnerait notre classe avec ses getters et setters :
<?php
class Personnage {
private $_id;
private $_nom;
private $_forcePerso;
private $_degats;
private $_niveau;
private $_experience;
// Liste des getters - renvoie (get) la valeur d'un attribut
public function id() { return $this->_id; }
public function nom() { return $this->_nom; }
public function forcePerso() { return $this->_forcePerso; }
public function degats() { return $this->_degats; }
public function niveau() { return $this->_niveau; }
public function experience() { return $this->_experience; }
// Liste des setters - assigne (set) une valeur à un attribut
public function setId($id) {
// On convertit l'argument en nombre entier.
// Si c'en était déjà un, rien ne changera.
// Sinon, la conversion donnera le nombre 0 (à quelques exceptions près, mais rien d'important ici).
$id = (int) $id;
// On vérifie ensuite si ce nombre est bien strictement positif.
if ($id > 0) {
// Si c'est le cas, c'est tout bon, on assigne la valeur à l'attribut correspondant.
$this->_id = $id;
}
}
public function setNom($nom) {
// On vérifie qu'il s'agit bien d'une chaîne de caractères.
if (is_string($nom))
{
$this->_nom = $nom;
}
}
//
public function setForcePerso($forcePerso) {
$forcePerso = (int) $forcePerso;
// On vérifie que la force passée est comprise entre 0 et 100.
if ($forcePerso >= 1 && $forcePerso <= 100) {
$this->_forcePerso = $forcePerso;
}
}
public function setDegats($degats) {
$degats = (int) $degats;
// On vérifie que les dégâts passés sont compris entre 0 et 100.
if ($degats >= 0 && $degats <= 100)
{
$this->_degats = $degats;
}
}
public function setNiveau($niveau) {
$niveau = (int) $niveau;
if ($niveau >= 1 && $niveau <= 100)
{
$this->_niveau = $niveau;
}
}
public function setExperience($experience) {
$experience = (int) $experience;
if ($experience >= 1 && $experience <= 100) {
$this->_experience = $experience;
}
}
}
Reprenons notre code de tout à l'heure, celui qui nous permettait de lire la BDD. Modifions-le un peu pour qu'on puisse manipuler des objets et non des tableaux :
<?php
// On admet que $db est un objet PDO
$request = $db->query('SELECT id, nom, forcePerso, degats, niveau, experience FROM personnages');
while ($donnees = $request->fetch(PDO::FETCH_ASSOC)) { // Chaque entrée sera récupérée et placée dans un array.
// On passe les données (stockées dans un tableau) concernant le personnage au constructeur de la classe.
// On admet que le constructeur de la classe appelle chaque setter pour assigner les valeurs qu'on lui a données aux attributs correspondants.
$perso = new Personnage($donnees);
echo $perso->nom(), ' a ', $perso->forcePerso(), ' de force, ', $perso->degats(), ' de dégâts, ', $perso->experience(), ' d\'expérience et est au niveau ', $perso->niveau();
}