JeuWeb - Crée ton jeu par navigateur
Apprendre la POO - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Apprendre la POO (/showthread.php?tid=504)

Pages : 1 2


Apprendre la POO - Globe - 25-02-2011

Bonjour à tous, comme beaucoup le savent je suis un peu naze en dev mais j'ai enfin pris le pas de me mettre à la POO. Donc j'ai commencé une classe, à savoir que ce n'est pas une question de débogage, le script est simplement destiné à comprendre la logique derrière la POO en PHP, ainsi y'a sûrement des erreurs de syntaxe j'ai fait ça sous bloc notes. Ma question tourne donc autour de la méthode vu que je sais bien que j'ai probablement fait des erreurs phénoménales Tongue

Dans les faits j'ai lu à droite et à gauche pas mal de tutos, mais qui au final ne donnent pas vraiment d'idées de l'approche qu'il faut avoir pour développer en POO, oui au jour d'aujourd'hui je sais faire une classe voiture et instancier des objets, mais de là à faire un site je suis pas convaincu que j'ai compri les mécanismes.

Bon très de bavardages inutiles, voici ce que j'ai commencé à faire.

Une classe membre, donc au niveau de l'organisation, un array est transmis au constructeur depuis le formulaire d'inscription ou de connexion, j'ai ensuite ces deux fonctions qui sont "sensées" faire ce qu'il y a à faire.

class membre {

public $idMembre;
public $pseudoMembre;
public $mdpMembre;
public $mdpConfirm;
public $emailMembre;

public function __construct ($arrayMembre) {
$this->idMembre = $arrayMembre['idMembre'];
$this->pseudoMembre = $arrayMembre['pseudoMembre'];
$this->mdpMembre = $arrayMembre['mdpMembre'];
$this->emailMembre = $arrayMembre['emailMembre'];
$this->mdpConfirm = $arrayMembre['mdpConfirm'];
}

public function inscription() {
$pseudoCheck = "SELECT COUNT(*) AS nbr FROM membres WHERE pseudo = '".$pseudoMembre."'";
$pseudoCheck2 = $bdd->query($pseudoCheck);
$pseudoCheck3 = $pseudoCheck2->fetch();

if(!($pseudoCheck3['nbr'] == 0))
{
$erreur="Ce pseudo est déjà utilisé !";
}
if($this->$mdp != $this->mdpConfirm)
{
$erreur = "Les champs de confirmation ne correspondent pas.";
}
if(!filter_var($emailMembre, FILTER_VALIDATE_EMAIL))
{
$erreur = "Le format de votre adresse E-Mail n'est pas valide.";
}
if(isset($erreur))
{
echo $erreur;
}
else
{
$db_insert = "INSERT INTO membres (id, pseudo, mdp, email) VALUES ('','".$pseudoMembre."', '".$mdpMembre."', '".$emailMembre."')";
$statement = $bdd->exec($db_insert);
echo "Vous etes désormais inscri";
}


}

public function connexion() {
$pseudoCheck = "SELECT COUNT(*) AS nbr FROM membres WHERE pseudo = '".$pseudoMembre."'";
$pseudoCheck2 = $bdd->query($pseudoCheck);
$pseudoCheck3 = $pseudoCheck2->fetch();
if($pseudoCheck3['nbr'] == 0)
{
$erreur="Ce membre n'existe pas !";
}
else
{
$login_sql = "SELECT mdp, id FROM membres WHERE pseudo='$pseudoMembre'";
$login_req = $bdd->query($login_sql);
$login_data = $login_req->fetch();
$id = $login_data['id'];
$mdpBDD = $login_data['mdp'];
if ($mdpMembre != $mdpBDD)
{
$erreur = "Le mot de passe ne correspond pas à celui enregistré !"
}
if (isset($erreur))
{
echo $erreur;
}
else
{
$this->idMembre = $login_data['id'];
session_start();
$_SESSION['id'] = $this->idMembre;
}
}
}


}



RE: Apprendre la POO - Kihmé - 25-02-2011

une question pour toi, sais tu pourquoi tu as mis publique pour la visibilité de tes attributs?

Ton constructeur semble bon, tu as compris à quoi il servait. Certain te conseilleront de faire comme tu as fait d'autre te diront de ne laisser le constructeur d'origine et d'utiliser une méthode faisant appelle aux setters.

les setters sont des méthodes propre à ta classe que tu vas utiliser quand tu auras besoin de modifier la valeur d'un attribut, donc chaque attribut doit avoir son propre setter.

Il existe les getters aussi, un getter renvoi la valeur de l'attribut demandé, ça renvoie à la question que j'ai posté au début de mon post. Il faut que tu apprennes à bien choisir la visibilité de tes attributs (pubilc, private, protected).

C'est un bon début. Prochaine phase, faire une autre classe qui serait en relation avec celle ci, puis les utiliser dans un "main".

Bon courage, tu pars plutôt bien la.

edit : pose toi des questions sur ta fonction "connexion", est elle propre à une instance de membre?


RE: Apprendre la POO - popayan - 25-02-2011

perso, je ne ferais pas d'echo dans mes méthodes mais plutot des "return". Si le but d'apprendre la POO c'est ensuite d'utiliser un framework autant prendre de bonnes habitudes.

aussi n'hésite pas a décomposer les méthodes, par exemple, la méthode inscription deviendrait:


function exist($pseudoMembre) {
$pseudoCheck = "SELECT COUNT(*) AS nbr FROM membres WHERE pseudo = '".$pseudoMembre."'";
$pseudoCheck2 = $bdd->query($pseudoCheck);
$pseudoCheck3 = $pseudoCheck2->fetch();

return $pseudoCheck3['nbr'];
}

public function inscription() {
if $this->exist($pseudoMembre) {
return "Ce pseudo est déjà utilisé !";
} else {
...
}



RE: Apprendre la POO - Globe - 25-02-2011

Déjà merci de vos réponses =)

J'essaye d'avancer pas à pas et mine de rien vous m'aidez pas mal.

Alors concernant la visibilité, d'après ce que j'ai compris, les variables publiques peuvent être modifiées en dehors de la classe, pour l'instant j'avouerais que je me suis dit que pour le moment c'était plus simple comme ça, si j'ai besoin d'accéder à ces valeurs je pourrait le faire de n'importe où. Dans les détails je ne suis pas encore à l'aise avec le concept de visibilité. C'est vrai que si toutes les fonctionnalités liées au membre sont gérées au sein même de la classe c'est ptet mieux de les mettre en private ? Par contre laisser l'id en public puisse que je m'en resservirais dans nombre d'autres classes non ?

Sinon pour la quesiton de return à la place des echo, je me suis posé la question, j'ai vu beaucoup de tutos utiliser des return et en fait je me suis tout simplement demandé l'intérêt par rapport aux echo qui me sont plus familiers. Je n'ai jamais que codé en procédural et beaucoup des concepts de la POO me rendent confus donc c'est vrai que j'essaye de garder autant de points de repères que possible mais si c'est mal bah je verrais comment faire tout ça avec des return. Enfin ce que j'ai vu dans les tutos ce sont des fonctions indépendantes qui retournaient la valeur des attributs, et j'ai pas bien saisi l'intérêt de faire une fonction perso alors que le echo existe. Donc si tu as des précisions je suis preneur =)

Enfin, je me suis posé la question de séparer la fonction de vérification, et à posteriori je me suis dit que c'est ce que j'aurais du faire, donc je ferais désormais bien attention à bien séparer tout ça =)

Merci encore pour vos réponses, je vais donc me renseigner sur la visibilité et essayer d'utiliser des return au lieu des echo désormais, je retourne à ma lecture, le problème demeure qu'il est très difficile d'avoir une vision globale puisque je ne trouve aucun tutoriel, cours ou exemple de code construit. Sur internet je trouve principalement des classes solitaires destinées à apprendre à les construire, mais ces cours se concentrent sur des concepts qui demeurent très abstraits sans exemples en pratique. J'ai bien trouvé 50 trucs qui enseignent comment faire une classe, mais aucun qui expliquent comment structurer son code et faire interagir de manière propre et rigoureuse ses classes.


RE: Apprendre la POO - Dexyne - 25-02-2011

Ah bah je suis pas le seul, beaucoup de tutos te disent comment est fait une classe, à quoi servent les méthodes, etc. mais rarement ça t'explique comment sont structurés les fichiers / dossiers / structure de code, etc. (bon après avec MVC ça parle un peu plus mais au début on est un peu perdu ^^).
Je trouve que l'utilisation d'un framework peut aidé à mieux comprendre certaines logique, j'utilise pour le moment CodeIgniter qui est un framework léger et qui laisse libre le développeur dans ça façon de coder et je trouve qu'on peut voir assez bien comment son constituer tel ou tel classes, fonctions, les différentes structures quoi.

PS: ça fait 2 fois que je te vois dire "au jour d'aujourd'hui" et je tiens juste à dire que ça veux rien dire XD c'était tout :x.


RE: Apprendre la POO - popayan - 25-02-2011

Globe, l'objet c'est assez délicat dans un premier temps mais une fois qu'on a pigé c'est nettement plus simple que le procédural (avis perso biensur). Un truc par exemple quelle est la différence entre ton constructeur et ta méthode inscription? Elles ont le même but, créer un nouveau membre. Ta méthode connexion, son but c'est de te retourner, en gros, touts les infos de ton membre.
Pour ce qui est de la visibilité, il vaut mieux tout laisser en private et utiliser des méthodes "accesseur", vaut mieux créer une méthode getXXX qui te retourne l'attribut XXX. Ca te sécurise ta classe.

PS: "au jour d'aujourd'hui" c'est un triple pléonasme...


RE: Apprendre la POO - Dexyne - 25-02-2011

Sinon pour les attributs y'a aussi la possibilité de les mettre en protected.

PS: Oui mais ça veut rien dire justement :o (enfin non pas que ça veut rien dire du faite d'être un triple pléonasme il en existe mais ça veut rien dire dans son sens si tu utilise l'origine des mots).


RE: Apprendre la POO - niahoo - 26-02-2011

Il te manque pas mal de classes différentes pour avoir une architecture objet qui va t'aider à assimiler les concepts de la POO. Les objets sont de petits éléments, il ne font généralement qu'un seul truc.

Ta classe utilisateur devrait simplement être capable d'aller chercher les infos d'un user dans la DB à partir d'un id, enregistrer un nouvel utilisateur, et éventuellement avoir des méthodes de recherche sur plusieurs utilisateurs (perso je sépare la logique 1 user : classe instanciable/ multi users: module de fonctions).

Donc, ta classe user ne serait qu'une couche d'accès à la base de données des utilisateurs. En ce sens, il n'est pas logique qu'elle ait une variable mdpConfirm. Elle devrait par contre accepter mdpConfirm dans sa méthode qui compare des données entrées par l'utilisateur avec des données en base pour confirmer son authentification lors du login, en renvoyant true ou false ; ou bien ce sera directement dans le constructeur, qui testera l'authentification, et il faudra donc ensuite demander à la classe si elle est authentifiée

$u = new user(...);
if($u->is_auth()) { ...

Dans la même logique, je sortirais la gestion de la session de ta classe, notamment le session_start() qui n'a rien à faire là.

Comme je te disais, il te manque pas mal de classes, ici par exemple je ferais une classe qui va gérer la session d'un utilisateur, comme un objet instancié qui reste persistant entre les appels de page. Mais tu peux également regrouper ceci dans ta classe utilisateur. dans ce cas, elle aura beaucoup de méthodes d'accès à des données de session.

Mais perso je séparerais la classe utilisateur d'accès aux données de la DB avec ma classe qui gère les données persistantes, car la première prends dans son constructeur des données de l'utilisateur, la seconde ne prends pas de variables dans son constructeur et sert uniquement d'interface aux données de la session.

voilà quelques réflexions qui pourront peut-être t'aider, mon idée était surtout de dire que les objets doivent se concentrer sur des points logiques très précis, et que pour cette raison il ne faut pas hésiter à créer une myriade de classes différentes.


RE: Apprendre la POO - Myrina - 27-02-2011

Hormis la compréhension du concept d'objet qui permet un découpage cohérent des classes avec ses propriétés et ses méthodes, il faut être très vigilant sur la portée des variables. Il y a en effet plusieurs erreurs dans ta classe (A toi des les déceler et de les corriger).

Une variable dans une méthode est
- soit une propriété de la classe accédée via $this->{nom de la variable} et de préférence déclarée au sein de la classe (le PHP ne l'oblige pas mais c'est préférable notamment pour gérer la visibilité de la propriété hors de la classe private|protected|public)
- soit une variable local accédée via ${nom de la variable} à la méthode correspondant à un des paramètres déclarés de la méthode ou simplement une variable déclarée localement

Il est quand même possible d'accéder aux variables globales comme dans les fonctions avec global ${nom de la variable} ou $_GLOBALS['nom de la variable'] mais c'est une pratique à éviter si possible


RE: Apprendre la POO - Globe - 27-02-2011

Merci encore pour vos clarifications, je pense en fait étudier un code open source pour saisir les subtilités et avoir une vision plus globale, c'est probablement une approche plus productive que de bidouiller à l'aveuglette =)

Sinon pour l'expression "Au jour d'aujourd'hui", elle existe et est utilisée par nombre de gens, j'en abuse sûrement par contre. En fait le débat est simple, d'une part les puristes de la langue qui haïssent cette expression du fait du pléonasme. Qui au final dans des termes sémantiques n'en est absolument pas un, aujourd'hui étant désormais un mot à part entière et dans son sens n'est plus associée à l'expression composée probablement moyenâgeuse "au jour d'hui". "Aujourd'hui" défini donc désormais le jour en question, au même titre que lundi ou mardi. Et "au jour" est simplement la variable associée. L'utilisation de "Au jour d'aujourd'hui" correspondrait donc grosso modo à $jour = "aujourd'hui"; au niveau du sens. Sinon dans la pratique je l'utilise pour insister sur la nature changeante du sujet discuté tout en ralentissant le discours rendant la phrase plus stable et donc faisant office de contrepoids par rapport au "je pense" que j'utilise souvent derrière. J'exprime ainsi une incertitude mais avec conviction =D Enfin je comprend pourquoi vous n'aimez pas, mais je garantie pas que je ne l'emploierais pas à nouveau vu que je ne relis mes messages que très rarement avant de les poster et que je ne cherche qu'a exprimer quelque chose et non pas à l'exprimer comme il faut =) Je finis donc mon explication par une petite pique, le langage à été inventé pour exprimer des idées, l'écriture à été inventé pour les transmettre sur le temps et la distance, l'attachement conservateur à la pureté d'une langue en constante évolution à été inventé par une bande de bigots qui n'avaient rien d'autre à faire. L'expression d'un sentiment se fait parfois bien mieux par une erreur de français, prenons un exemple simple qui m'a valu bien des déboires en rédaction dans ma jeunesse : "Il faisait noir et j'étais seul. Seul."
Un conservateur va vous dire que c'est une horreur, un adjectif solitaire en guise de phrase c'est totalement incorrect. Cependant ce mécanisme permet de renforcer l'idée, c'est une conclusion sinistre. Très souvent utilisée dans les voix off ou ce genre de choses. J'exprime donc simplement l'idée que la langue est là pour exprimer des choses et que s'y attacher au point de brider toute liberté est à mon avis idiot. D'ailleurs dans mes cercles les néologismes fusent et les expériences avec la langue aussi. L'important pour moi est donc d'être compris, pas au niveau du sens des mots, mais au niveau du sens de mon idée. Tout le monde sent l'emphase de l'expression "Au jour d'aujourd'hui" ou est complètement insensible aux variations de la langue.