IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[POO] Méthode de choix de la classe


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Lost In Translation
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 166
    Par défaut [POO] Méthode de choix de la classe
    Bonjour à tous,

    Alors, c'est une question plutôt généraliste, mais qui va tourner sur PHP5 et le web en général. Donc j'le poste là.

    Comment sait-on quand on doit faire de quelque chose un "objet" ?

    Par exemple, je programme un jeu depuis 2ans.
    Au départ, je faisais dans le purement procédural... j'en suis venu à la POO.

    Pour mon jeu, par exemple, j'ai une classe pour la gestion des personnages, une classe pour la gestion des "joueurs", une classe pour ma gestion de bdd, une classe pour la messagerie, les news, les sorts magiques....

    Mais j'me dis que c'est pas "optimal"
    - est-ce que j'ai fais des classes pour des choses qui ne devraient pas l'être
    - est ce que j'aurais pas fait des classes trop grosses (certaine dépassent les 1500 lignes)

    Alors, j'voulais savoir comment vous vous déterminez quand quelque chose doit être un "objet".

    Par exemple, pour l'inscription au jeu :
    Devrais-je avoir une classe "comptejoueur" avec des méthodes genre
    ->AjouterCompte()
    ->SupprimerCompte

    ou alors, est-ce que vous appelez votre classe de gestion SQL qui fait dans le script d'inscription la requête "INSERT..." ?

    J'ai l'impression que j'ne fais pas encore de l'objet à 100%.... et j'ai beau lire des cours, voir des codes, j'me dis "est-ce que j'suis vraiment dans l'truc, ou à l'ouest"?

    Alors par exemple, voici mon script d'inscription (j'vous mets pas les classes... appelés, ça serait vraiment trop long). Que pourrait-on y faire ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
     
    <?php
    /*
    Fichier : inscription.php
    Date : 04/06/2007 00:01:36
    Description :
      - fichier d'inscription
    ----------
    
    */
     
    /******************************************************/
    /***** Anti-hacking / Insclusion / Instanciations *****/
    /******************************************************/
     
    define('INC_OK',true); 
     
    //les inclusions
    require("libs/template.class.php");
    require("libs/drsql.class.php");
    require("libs/Joueur.class.php");
    require("libs/config.inc.php");
     
    //instanciation des objets
    $TPL = new template();
    $DB = new DrSql($host,$user,$pass,$bdd);
    $Joueur = new Joueur($DB,$TPL);
     
    /*************************/
    /***** les variables *****/
    /*************************/
     
    $message_error = NULL;
    $Affichage = false;
    $titrePage = 'Page d\'Inscription sur le jeu Pen Arvin';
     
    /*****************/
    /***** DEBUT *****/
    /*****************/
     
    /*******************************/
    /***** actions de sessions *****/
    /*******************************/
     
    $Joueur->EtrePageSecurisee(false);
     
    //j'assigne le nom de la page
    $TPL->assign('titrePage',$titrePage);
    //j'assigne mon footer
    $TPL->assign('version',$version);
     
    /***************************/
    /***** Traitement POST *****/
    /***************************/
     
    if($_SERVER['REQUEST_METHOD'] == 'POST')
    {
      extract($_POST);
      if (isset($mail) && isset($pwd) && isset($c_pwd))
      {
        if (!empty($mail) && !empty($pwd) && !empty($c_pwd))
        {
          $form = true;
     
          if ($pwd != $c_pwd)
          {
            $message_error .= 'Vos mots de passes ne sont pas les mêmes<br />';   
            $form = false;
        }
     
        if ($form == true)
        {
          if ($Joueur->EtreMailValide($mail))
            $form=true;
          else
          {
          $form = false;
          $message_error .= 'cette adresse mail n\'est valide.<br />';
          }
        }
     
        if ($form == true)
        {
          //compte existant ?
          $Requete = $DB->query("SELECT * FROM CompteJoueur WHERE CJ_Mail='{$mail}'");
          if($Requete->num_rows <= 0 )
          {
            //non : insertion
            $DB->query("INSERT INTO CompteJoueur VALUES ('','{$mail}','".md5($pwd)."','0','".$Joueur->DonnerIp()."')");
     
            //envoi d'un email             
            $from_email = "rwkpocketjedi@hotmail.com";   
            $entetedate = date("D, j M Y H:i:s -0600"); // avec offset horaire   
            $entetemail = "From: $from_email \n"; // Adresse expéditeur  
            $entetemail .= "Cc: \n";  
            $entetemail .= "Bcc: \n"; // Copies cachées   
            $entetemail .= "Reply-To: $from_email \n"; // Adresse de retour   
            $entetemail .= "X-Mailer: PHP/" . phpversion() . "\n" ;
            $entetemail .= "Date: $entetedate"; 
     
            $texte ='Bonjour, vous venez de vous enregistrer sur Pen Arvin avec l\'adresse e-mail suivante '.$mail.'
                     Veuillez confirmer votre inscription en cliquant sur le lien suivant :
                     '.$adresseSite.'valid.php
    
                     Ne répondez pas à cet e-mail.
                     Bon jeu.
                     ';
     
            if($mailEnvoi)
              mail(
                $mail,
                'Insciption sur Pen Arvin',
                $texte,
                $entetemail
              );
            else
              $contenu .=  '<p>Pour valider votre compte, <a href="valid.php">CLIQUEZ ICI</a></p>';
     
            $contenu .= '<p>Votre inscription est un succès.</p>';
     
            //assignation
            $TPL->assign(
                    array(
                      'form' => true,
                      'message_error' => NULL,
                      'mail' => NULL,
                      'contenu' => $contenu
                    )
            );
     
            //affichage page
            $TPL->parse('inscription.tpl');
     
          }
          else
          {//oui : compte existant
              $message_error .= 'Ce compte existe déjà. Veuillez utiliser une autre adresse mail<br />';
              $form = false;
          }
        }
      }
      else
      {
        $message_error .= 'Veuillez remplir tous les champs<br />';
        $form = false;
      }
    }
    }
     
    /*********************************/
    /***** Gestion post/pré POST *****/
    /*********************************/
     
    if ($Affichage == false)
    {
      if(empty($message_error))
      {
        //page invoquée pour la 1ere fois 
        $TPL->assign(
                array(
                  'form' => false,
                  'message_error' => NULL,
                  'mail' => NULL,
                  'contenu' => NULL
                )
        );
      }
      else
      {
        //page invoquée suite a une erreur
        $TPL->assign(
                array(
                  'form' => false,
                  'message_error' => $message_error,
                  'mail' => $mail,
                  'contenu' => NULL
                )
        );
      }
      //affichage
      $TPL->parse('inscription.tpl');
    }
     
    /***************/
    /***** FIN *****/
    /***************/
    ?>

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 672
    Par défaut
    Citation Envoyé par Lost In Translation Voir le message
    J'ai l'impression que j'ne fais pas encore de l'objet à 100%....
    personne ne fait de l'objet à 100 % c'est pour ça qu'on appelle ça de la Programmation Orienté Objet et non de la Programmation Objet

    la POO est juste une façon de présenter le code pour en faciliter la maintenance, pour éviter d'avoir du code en double, etc.

    Personnellement je pense que c'est avec l'expérience que tu apprendras à organiser tes classes de mieux en mieux. Si tu as des questions sur un point précis d'un bout de code, tu peux toujours venir sur le forum mais tout ce que les autres développeurs pourront t'apporter ce sont des conseils que tu devras adapter et appliquer à ta propre façon de créer des classes

  3. #3
    Membre confirmé Avatar de Lost In Translation
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 166
    Par défaut
    Bah par exemple :

    Les instructions SQL genre requete, vaut il mieux créer une méthode spécifique... du genre, CreerCompte / SupprimerCompte, CreerPersonnage / SupprimerPersonnage ou alors les utiliser quand on en a besoin...

    En gros

    blabla
    $Objet->CreerCompte();


    OU

    Blabla
    //je créé mon compte
    $Db->query("INSERT...");

    Pour commencer en terme de conseil ça peut m'aider.

    Quand je code, j'ai :
    1- fichier de template (que du JS/HTML)
    2- fichier php avec les instructions (appels de classes, instructions)
    3- fichier de classes

    Ca se rapproche plus ou moins du MVC. En gros j'veux savoir si la totalité de mes requetes doit plutôt se trouver dans les classes ou alors, on s'en fout et si ça se trouve dans le "script d'appel"... et bah c'est pas grave ^^

  4. #4
    mon_nom_est_personne
    Invité(e)
    Par défaut
    concernant ta derniere question je te recommanderais la chose suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    class db
    {
    private $dbConn;
     
    public function __construc()
    {
    //cree ta connection etc... et on va suppose que ta connection est stockee dans la variable $dbConn
     
    $this->dbConn = connection a ta base de donnee;
    }
     
    public function CreerCompte()
    {
    //ca depend de ce que ta utilise pour effectuer ta connection , on va supose que c'est un objet de type pdo
    $this->dbConn->query('insert.....');
    }
    }
     
     
    $db = new db();
    $db->CreerCompte();
    c'est une facon de faire, mais si comme moi t'es un vrai feign... dev qui aime la poo des requetes de type 'INSERT INTO table(champ1, etc..) VALUES(vasleur1, etc..) WHERE condition1 AND condition2 etc..' tu vas en ecrire des milliers donc pk pas faire une requete a troux (attention cette methode est a gros risque d'injection sql donc penser aussi a assainnir la requete mais j'eluderais la question pour un souci de generalite).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    class db
    {
    private $dbConn;
     
    public function __construc()
    {
    //cree ta connection etc... et on va suppose que ta connection est stockee dans la variable $dbConn
     
    $this->dbConn = connection a ta base de donnee;
    }
     
    //conditionSimple est une variable non obligatoire car on peu inserer sans condition et un champ de type string pour les trucs en tout genre de type ON DUPLICATE KEY UPDATE etc...
     
    public function insert($tableName, array $fieldName, array $newValues, array $conditionSimple = array(), $options = '')
    {
    // on va dire que c'est une function qui retourne un tableau associatif dont les indexs sont les noms des variables
    $listOfVar = $this->sanitize(func_get_args());
    $insertSql = "INSERT INTO ".$listOfVar['tableName'];
    $insertSql .= "(";
    foreach($listOfVar['fieldName'] as $field)
    {
      $insertSql .= $field.", ";
    }
    //retir la derniere virgule qui sert a rien
    rtrim($insertSql, ',');
    $insertSql .= ") VALUES (";
    foreach($listOfVar['fieldName'] as $field)
    {
      $insertSql .= $field.", ";
    }
    foreach($listOfVar['newValues'] as $val)
    {
      $insertSql .= $val.", ";
    }
    rtrim($insertSql, ',');
    $insertSql .= ")";
     
    // pour les where c'est le meme que precedant sauf que t'au un if avant pour voir si c'est null ou pas 
     
    ....
     
    $inserSql .= $listOfVar['option'];
     
    $dbConn->query($insertSql);
    }
     
    protected function sanitize(array $arg)
    {
    // assainit les arguments
    return array("arg1" => valeur1, etc...);
    }
    }
     
    $truc = new db();
    $truc->insert('table', array('champ1','champ2'),array(15,'papa'),array('champ2 in (papa, maman)'));
    Ca a l'air gros etc... mais c'est pedagogique, et n'ecoute pas les gens qui vont te dire que superMeilleurFramwork2000 le fait deja, car la seul chose que tu vas apprendre c'est utilise superMeilleurFramwork2000 et le jour ou pour x raison t'auras un truc a faire a la main tu sauras pas ce qui se passe derriere.

  5. #5
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Pas d'accord avec mon_nom_est_personne (comme quoi les facons de faire ^^ ).

    Pourquoi mettre des méthodes qui concerne les utilisateurs dans une classe qui concerne sql ?

    Pour généraliser c'est comme si tu faisais
    $voiture->laver() // Depuis quand une voiture peut elle se laver seule ?
    au lieu de $elephantbleu->laver($voiture).

    Bref, perso je préfère faire une classe utilisateur par exemple dans laquelle se trouverons les méthodes ajouter / supprimer / editer ....

    L'avantage par rapport au requête directement dans le code , c'est que tu auras une seule requête dans ta classe pour peut être plusieurs utilisations.
    Du coup si tu viens a modifier ta base par exemple , tu auras juste une modif à faire dans ta classe et c'est tout.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    mon_nom_est_personne
    Invité(e)
    Par défaut
    si tu veux tu peu l'appeller insertMoiUnUtilisateur ($db->insertMoiUnUtilisateur)
    Bref ca c'est de la nomenclature. le truc c'est que cette methode ne fait que traiter de la requete sql et p-e formater le resultat. Je suis d'accord que si cette methode commence a envoyer des email etc... c'est un gros erreur de conception. Ici elle fait qu'executer une requete

Discussions similaires

  1. [Débutant] [POO] Définition de Méthodes au sein d'une classe Objet
    Par ghada97 dans le forum MATLAB
    Réponses: 7
    Dernier message: 29/11/2013, 18h31
  2. Choix d'une classe pour appel de méthodes statiques
    Par Antwan76ers dans le forum Débuter avec Java
    Réponses: 11
    Dernier message: 05/07/2012, 10h55
  3. [POO] utiliser une méthode présente dans une autre classe
    Par arnaudperfect dans le forum Langage
    Réponses: 5
    Dernier message: 19/10/2007, 14h23
  4. Réponses: 4
    Dernier message: 17/03/2007, 01h06
  5. Réponses: 3
    Dernier message: 16/04/2004, 16h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo