Exemple du jeu «personnage»
Exemple du cours
Section titled “Exemple du cours”Le repository
Section titled “Le repository”Les fichiers
Section titled “Les fichiers”<?php
//on inclue le fichier qui initialise tout ce dont on a besoinrequire 'bootstrap.php';
//Tests sur les objets$perso1 = new Personnage; // Un premier personnage$perso2 = new Personnage; // Un second personnage
$perso1->setForcePerso(10);$perso1->setExperience(2);
$perso2->setForcePerso(90);$perso2->setExperience(58);
$perso1->frapper($perso2); // $perso1 frappe $perso2$perso1->gagnerExperience(); // $perso1 gagne de l'expérience
$perso2->frapper($perso1); // $perso2 frappe $perso1$perso2->gagnerExperience(); // $perso2 gagne de l'expérience
echo 'Le personnage 1 a ', $perso1->forcePerso(), ' de force, contrairement au personnage 2 qui a ', $perso2->forcePerso(), ' de force.<br />';echo 'Le personnage 1 a ', $perso1->experience(), ' d\'expérience, contrairement au personnage 2 qui a ', $perso2->experience(), ' d\'expérience.<br />';echo 'Le personnage 1 a ', $perso1->degats(), ' de dégâts, contrairement au personnage 2 qui a ', $perso2->degats(), ' de dégâts.<br />';
//Test de l'insertion en base de données$perso = new Personnage;
$perso = new Personnage([ 'nom' => 'Victor', 'forcePerso' => 5, 'degats' => 0, 'niveau' => 1, 'experience' => 0]);// var_dump($perso);
//$db = new PDO('mysql:host=localhost;dbname=php', 'php', 'php');$db = new PDO('sqlite:'.dirname(__FILE__).'/database.sqlite');$persoRepo = new PersonnagesRepository($db);
if($persoRepo->add($perso)) echo "Personnage ".$perso->nom()." ajouté dans la base de données!";else echo "Erreur lors de l'ajout dans la base de donnée";<?php
ini_set('display_errors', 1);ini_set('display_startup_errors', 1);error_reporting(E_ALL);
function autoload($classe){ if(file_exists('Models/'.$classe . '.php')) require 'Models/'.$classe . '.php'; if(file_exists('Repositories/'.$classe . '.php')) require 'Repositories/'.$classe . '.php';}spl_autoload_register('autoload'); // On enregistre la fonction en autoload pour qu'elle soit appelée dès qu'on instancie une classe non déclarée.<?phpclass Personnage{ private $id; private $nom; private $forcePerso; private $degats; private $niveau; private $experience;
public function __construct($values = array()) { if (!empty($values)) { $this->hydrate($values); } }
// PARCOURS du tableau $donnees (avec pour clé $cle et pour valeur $valeur) // On assigne à $setter la valeur « 'set'.$cle », en mettant la // première lettre de $cle en majuscule (utilisation de ucfirst()) // SI la méthode $setter de notre classe existe ALORS // On invoque $setter($valeur) // FIN SI // FIN PARCOURS
// $donnees = [ // 'id' => 16, // 'nom' => 'Vyk12', // 'forcePerso' => 5, // 'degats' => 55, // 'niveau' => 4, // 'experience' => 20 // ];
// Un tableau de données doit être passé à la fonction (d'où le préfixe « array »). public function hydrate(array $donnees) { foreach ($donnees as $key => $value) { // On récupère le nom du setter correspondant à l'attribut. $method = 'set' . ucfirst($key); // ucfirst important! Par exemple, le setter correspondant à nom est setNom.
// Si le setter correspondant existe. if (method_exists($this, $method)) { // On appelle le setter. $this->$method($value); } } }
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; }
public function setId($id) { // L'identifiant du personnage sera, quoi qu'il arrive, un nombre entier. $this->id = (int) $id; }
public function setNom($nom) { // On vérifie qu'il s'agit bien d'une chaîne de caractères. // Dont la longueur est inférieure à 30 caractères. if (is_string($nom) && strlen($nom) <= 30) { $this->nom = $nom; } }
public function forceAuHasard() { $this->setForcePerso(rand(0,100)); }
public function setForcePerso($forcePerso) { $forcePerso = (int) $forcePerso;
// On vérifie que la force passée est comprise entre 0 et 100. if ($forcePerso >= 0 && $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;
// On vérifie que le niveau n'est pas négatif. if ($niveau >= 0) { $this->niveau = $niveau; } }
public function setExperience($exp) { $exp = (int) $exp;
// On vérifie que l'expérience est comprise entre 0 et 100. if ($exp >= 0 && $exp <= 100) { $this->experience = $exp; } }
public function frapper(Personnage $persoAFrapper) { // Utiliser les getters/setters plutôt que l'accès direct aux propriétés privées. $persoAFrapper->setDegats($persoAFrapper->degats() + $this->forcePerso()); }
public function gagnerExperience() { // Respecter les validations du setter. $this->setExperience($this->experience() + 1); }}<?phpclass PersonnagesRepository{ private $db; // Instance de PDO
public function setDb(PDO $db) { $this->db = $db; } // //SQL Table code // CREATE TABLE `personnages` ( // `id` INT NOT NULL AUTO_INCREMENT , // `nom` VARCHAR(32) NOT NULL , // `forcePerso` INT NULL , // `degats` INT NULL , // `niveau` INT NULL , // `experience` INT NULL , // PRIMARY KEY (`id`)) ENGINE = InnoDB;
public function __construct($db) { $this->setDb($db); }
//CREATE public function add(Personnage $perso) { $q = $this->db->prepare('INSERT INTO personnages(nom, forcePerso, degats, niveau, experience) VALUES(:nom, :forcePerso, :degats, :niveau, :experience)');
$q->bindValue(':nom', $perso->nom()); $q->bindValue(':forcePerso', $perso->forcePerso(), PDO::PARAM_INT); $q->bindValue(':degats', $perso->degats(), PDO::PARAM_INT); $q->bindValue(':niveau', $perso->niveau(), PDO::PARAM_INT); $q->bindValue(':experience', $perso->experience(), PDO::PARAM_INT);
$result = $q->execute();
if(!$result) { echo "<br>PDOStatement::errorInfo() dans la fonction add(Personnage) :<br><pre>"; $arr = $q->errorInfo(); print_r($arr); echo "</pre>"; }
return $result;
}
//READs public function get($id) { $id = (int) $id;
$q = $this->db->query('SELECT id, nom, forcePerso, degats, niveau, experience FROM personnages WHERE id = ' . $id); $donnees = $q->fetch(PDO::FETCH_ASSOC);
return new Personnage($donnees); }
public function getList() { $persos = [];
$q = $this->db->query('SELECT id, nom, forcePerso, degats, niveau, experience FROM personnages ORDER BY nom');
while ($donnees = $q->fetch(PDO::FETCH_ASSOC)) { $persos[] = new Personnage($donnees); }
return $persos; }
//UPDATE public function update(Personnage $perso) { $q = $this->db->prepare('UPDATE personnages SET forcePerso = :forcePerso, degats = :degats, niveau = :niveau, experience = :experience WHERE id = :id');
$q->bindValue(':forcePerso', $perso->forcePerso(), PDO::PARAM_INT); $q->bindValue(':degats', $perso->degats(), PDO::PARAM_INT); $q->bindValue(':niveau', $perso->niveau(), PDO::PARAM_INT); $q->bindValue(':experience', $perso->experience(), PDO::PARAM_INT); $q->bindValue(':id', $perso->id(), PDO::PARAM_INT);
$result = $q->execute();
if(!$result) { echo "<br>PDOStatement::errorInfo() dans la fonction update(Personnage) :<br><pre>"; $arr = $q->errorInfo(); print_r($arr); echo "</pre>"; }
return $result; }
//DELETE public function delete(Personnage $perso) { $this->db->exec('DELETE FROM personnages WHERE id = ' . $perso->id()); }}