26-11-2010, 11:10 PM
En fait, tu vas devoir élaborer ce qu'on appelle un mapping. Les objets utilisés en POO ne sont pas compatible avec les bases de données relationnelles. Ce qu'on fait c'est que la où en procédural et relationnel on avait une table utilisateur on va rajouter à notre application une classe utilisateur. Elle aura comme propriété la même chose que notre table a en propriété. La version la plus basique voudrait que ta classe utilisateur a comme propriété : id, nom, dateNaissance si ta table est sous cette forme UTILISATEUR(#id, nom, date_naissance). A la création d'un utilisateur, dans ton constructeur pourquoi pas, tu ouvres une connexion à la bdd puis applique une requète d'insertion où tu passes en paramètre les propriétés de ta classe. PDO gère ça très bien. Du coup tes setters fonctionneront pareil. Je sens qu'il faudrait que je te fasse un step by step sur un exemple concret, j'ai peur d'être vague et que le théorique ne suffise pas.
Par exemple dans ta classe tu rajoutes un setter afin de modifier le nom.
Pour tes stats, je me dis que ta bdd doit être composée d'une table unité et les caractéristiques de tes unités sont dans cette table chacune en tant que colonne non?
Si c'est le cas, dans ta CLASS unité, tu vas avoir une ou plusieurs méthodes qui vont te renvoyer en sortie la stat issus des traitements des caractéristiques (attributs de la class unité).
Pour l'exemple suivant on oubli pas que les méthodes getDefense() et getVitesse() doivent être dans cette même classe et qu'elles renvoient les caractéristiques qui leur correspondent puisque dans la méthode getDefense() par exemple, on s'est connecté à la bdd et on a récupéré la valeur de la défense par un select defense from unité where id = attribuIdDeLaClass
Pour ce qui est des ArrayObject, il sagit de collection d'objet, c'est parce que dans mon exemple j'ai une classe creature et une autre training et que mon Player à plusieurs creatures et trainings qui lui sont associé. On bdd quand tu as une relation One to Many tu utilises les clés étrangères, ici creature aurait en clé étrangère la clé primaire de Player. En OOP basé sur l'UML, ma classe Player va avoir une collection (tableau) où dedans seront stocké toutes les créatures qui lui sont associées (sous forme d'objet), une créature est un objet. Et dans creature il y a aura une propriété de type Player contenant l'instance de la class Player qui possède la créature.
bdd :
Player (#id, nom)
Creature (#id, nom, #id_player)
poo :
Class Player
- id de type entier
- nom de type chaine
- Collection d'objet chacun étant de type Creature
Class Creature
- id de type entier
- nom de type chaine
- propriétaire de type Player
(note : le php n'est pas un langage typé, donc on s'affranchit de notifier dans le code de quel typé est une variable ou un attribu)
Il faut savoir que l'utilisation de la POO avec une bdd est un cas particulier qui peut créer la confusion dans l'esprit.
Peut être serait il mieux de commencer par essayer de faire de la poo, puis une fois seulement lorsque tu seras confronté aux problèmes de persistance tu pourras rajouter la bdd. Comme tu veux. N'hésite pas pour les questions, je peux peut être aussi me motiver pour un vrai cas exemple.
Par exemple dans ta classe tu rajoutes un setter afin de modifier le nom.
public function setName($unNouveauNom)
{
//traitement de connexion à la bdd
//Connexion à la bdd, puis élaboration de la requete , envoi de la requete.
$this->name=$unNouveauNom;
}
Pour tes stats, je me dis que ta bdd doit être composée d'une table unité et les caractéristiques de tes unités sont dans cette table chacune en tant que colonne non?
Si c'est le cas, dans ta CLASS unité, tu vas avoir une ou plusieurs méthodes qui vont te renvoyer en sortie la stat issus des traitements des caractéristiques (attributs de la class unité).
Pour l'exemple suivant on oubli pas que les méthodes getDefense() et getVitesse() doivent être dans cette même classe et qu'elles renvoient les caractéristiques qui leur correspondent puisque dans la méthode getDefense() par exemple, on s'est connecté à la bdd et on a récupéré la valeur de la défense par un select defense from unité where id = attribuIdDeLaClass
Class Unité
{
private $id;
private $name;
private $defense;
private $vitesse;
private $force;
public function statAgilité()
{
$agilité=$this->getDefense()*getVitesse();
return $agilité;
}
}
Pour ce qui est des ArrayObject, il sagit de collection d'objet, c'est parce que dans mon exemple j'ai une classe creature et une autre training et que mon Player à plusieurs creatures et trainings qui lui sont associé. On bdd quand tu as une relation One to Many tu utilises les clés étrangères, ici creature aurait en clé étrangère la clé primaire de Player. En OOP basé sur l'UML, ma classe Player va avoir une collection (tableau) où dedans seront stocké toutes les créatures qui lui sont associées (sous forme d'objet), une créature est un objet. Et dans creature il y a aura une propriété de type Player contenant l'instance de la class Player qui possède la créature.
bdd :
Player (#id, nom)
Creature (#id, nom, #id_player)
poo :
Class Player
- id de type entier
- nom de type chaine
- Collection d'objet chacun étant de type Creature
Class Creature
- id de type entier
- nom de type chaine
- propriétaire de type Player
(note : le php n'est pas un langage typé, donc on s'affranchit de notifier dans le code de quel typé est une variable ou un attribu)
Il faut savoir que l'utilisation de la POO avec une bdd est un cas particulier qui peut créer la confusion dans l'esprit.
Peut être serait il mieux de commencer par essayer de faire de la poo, puis une fois seulement lorsque tu seras confronté aux problèmes de persistance tu pourras rajouter la bdd. Comme tu veux. N'hésite pas pour les questions, je peux peut être aussi me motiver pour un vrai cas exemple.