Personnellement, je trouve que l'avantage le plus "visible" de la POO est le faible nombre de paramètre à passer dans des fonctions. En effet : un objet (c'est à dire la "matérialisation" de la classe dans le code) contient déjà un certain nombre de propriétés (variables) qui pourront être réutilisées dans ses propres méthodes (fonctions). Un exemple sur un script simple d'attaque :
- On part du principe qu'on a un personnage sur la carte. Chaque perso a 4 caractéristiques : Dextérité, Puissance, Mental, Volonté.
- On distingue deux types de personnages : guerrier et mage. Le guerrier réussit son attaque si il réussit un test de dextérité et ses dégâts seront fonction de sa puissance. Le mage réussit une attaque sur un test de mental et ses dégâts sont fonctions de sa volonté.
- Pour ne pas compliquer les choses, on ne tiendra pas compte d'une cible éventuelle : le héros tape dans le vide.
Tout d'abord : en procédural
- On part du principe qu'on a un personnage sur la carte. Chaque perso a 4 caractéristiques : Dextérité, Puissance, Mental, Volonté.
- On distingue deux types de personnages : guerrier et mage. Le guerrier réussit son attaque si il réussit un test de dextérité et ses dégâts seront fonction de sa puissance. Le mage réussit une attaque sur un test de mental et ses dégâts sont fonctions de sa volonté.
- Pour ne pas compliquer les choses, on ne tiendra pas compte d'une cible éventuelle : le héros tape dans le vide.
Tout d'abord : en procédural
Code PHP :
<?php
//On définit les caractéristiques de notre personnage.
$nom = "Georges";
$type = "guerrier";
$dex = 10;
$pui = 12;
$men = 5;
$vol = 7;
//On crée une fonction attaque qui renvoie 0 en cas d'échec et le nombre de dégâts en cas de réussite
//Cette fonction prends deux paramètres : la caractéristique utilisée pour l'attaque et celle utilisée pour les dégâts
function attaque($att, $deg) {
//Attaque : on lance un d20; si c'est inférieur ou égal à la carac, on passe à la suite
$lancerAtt = mt_rand(0, 20);
if($lancerAtt <= $att) { //L'attaque est passée !
//On calcule les dégâts (caracs de dégâts + d10)
$degats = $deg + mt_rand(0, 10);
$retour = $degats;
} else { //L'attaque a échoué. Quel nul, ce Georges...
$retour = 0;
}
return $retour;
}
//On réalise l'attaque :
echo "$nom attaque avec tout son talent de $type !<br />";
if($type == "guerrier") {
$bilan = attaque($dex, $pui);
} else {
$bilan = attaque($men, $vol);
}
if($bilan) {
echo "$nom a réussit son attaque ! Quel héros, ce $nom !!! Les dégâts sont de $bilan points de vie...";
} else {
echo "$nom a loupé son attaque... Quel gros nul, ce $nom !";
}
?>
Ensuite, en POO :
Code PHP :
<?php
//On déclare la classe Heros
class Heros {
//On déclare les propriétés
public $nom = "Georges";
public $type = "guerrier";
public $dex = 10;
public $pui = 12;
public $men = 5;
public $vol = 7;
//On déclare les méthodes
//Constructeur de la classe
function __construct() {
}
//On crée une méthode attaque qui renvoie 0 en cas d'échec et le nombre de dégâts en cas de réussite
public function attaque() {
//Attaque : on lance un d20; si c'est inférieur ou égal à la carac, on passe à la suite
if($this->type == "guerrier") {
$att = $this->dex;
$deg = $this->pui;
} else {
$att = $this->men;
$deg = $this->vol;
}
$lancerAtt = mt_rand(0, 20);
if($lancerAtt <= $att) { //L'attaque est passée !
//On calcule les dégâts (caracs de dégâts + d10)
$degats = $deg + mt_rand(0, 10);
$retour = $degats;
} else { //L'attaque a échoué. Quel nul, ce Georges...
$retour = 0;
}
return $retour;
}
}
//On crée notre combattant
$Georges = new Heros();
//On réalise l'attaque :
echo $Georges->nom . " attaque avec tout son talent de " . $Georges->type . " !<br />";
$bilan = $Georges->attaque();
if($bilan) {
echo $Georges->nom . " a réussit son attaque ! Quel héros, ce " . $Georges->nom . "!!! Les dégâts sont de $bilan points de vie...";
} else {
echo $Georges->nom . " a loupé son attaque... Quel gros nul, ce " . $Georges->nom . " !";
}
?>