Hydrater
TP POO : Mini-jeu de combat
Donner des valeurs aux attributs
Au début, nous avons un objet Personnage dont les attributs sont vides. L'hydratation consiste à assigner des valeurs aux attributs : nous avons donc hydraté l'objet
<?php
class Personnage {
// ...
public function hydrate(array $donnees) {
foreach ($donnees as $key => $value) {
$method = 'set'.ucfirst($key);
if (method_exists($this, $method))
{
$this->$method($value);
}
}
}
// ...
}
Constructeur
Il ne manque plus qu'à implémenter le constructeur pour qu'on puisse directement hydrater notre objet lors de l'instanciation de la classe. Pour cela, ajoutez un paramètre : $donnees. Appelez ensuite directement la méthode hydrate().<?php
class Personnage {
// ...
public function __construct(array $donnees) {
$this->hydrate($donnees);
}
// ...
}
Code complet
<?php
class Personnage {
private $_degats,
$_id,
$_nom;
const CEST_MOI = 1; // Constante renvoyée par la méthode `frapper` si on se frappe soi-même.
const PERSONNAGE_TUE = 2; // Constante renvoyée par la méthode `frapper` si on a tué le personnage en le frappant.
const PERSONNAGE_FRAPPE = 3; // Constante renvoyée par la méthode `frapper` si on a bien frappé le personnage.
public function __construct(array $donnees) {
$this->hydrate($donnees);
}
public function frapper(Personnage $perso) {
if ($perso->id() == $this->_id) {
return self::CEST_MOI;
}
// On indique au personnage qu'il doit recevoir des dégâts.
// Puis on retourne la valeur renvoyée par la méthode : self::PERSONNAGE_TUE ou self::PERSONNAGE_FRAPPE
return $perso->recevoirDegats();
}
public function hydrate(array $donnees) {
foreach ($donnees as $key => $value) {
$method = 'set'.ucfirst($key);
if (method_exists($this, $method)) {
$this->$method($value);
}
}
}
public function recevoirDegats() {
$this->_degats += 5;
// Si on a 100 de dégâts ou plus, on dit que le personnage a été tué.
if ($this->_degats >= 100) {
return self::PERSONNAGE_TUE;
}
// Sinon, on se contente de dire que le personnage a bien été frappé.
return self::PERSONNAGE_FRAPPE;
}
// GETTERS //
public function degats() { return $this->_degats; }
public function id() { return $this->_id; }
public function nom() { return $this->_nom; }
public function setDegats($degats) {
$degats = (int) $degats;
if ($degats >= 0 && $degats <= 100) {
$this->_degats = $degats;
}
}
public function setId($id) {
$id = (int) $id;
if ($id > 0) {
$this->_id = $id;
}
}
public function setNom($nom) {
if (is_string($nom)) {
$this->_nom = $nom;
}
}
}