Skip to content

Exemple du jeu «personnage»

Le repository

index.php
<?php
//on inclue le fichier qui initialise tout ce dont on a besoin
require '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";
bootstrap.php
<?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.
Models/Personnage.php
<?php
class 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);
}
}
Repositories/PersonnagesRepository.php
<?php
class 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());
}
}