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] Besoin de tutorat sur les classes


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 21
    Points : 14
    Points
    14
    Par défaut [POO] Besoin de tutorat sur les classes
    Bonsoir,
    un peu d'histoire:
    Jai appris le php seul avec des tutos sur le net, j'ai pas mal coder pour le plaisir et j'en suis forcement arrivé a la POO.

    sauf que je n'ai le retour de personne sur mes codes... donc je sais pas si je code "bien".

    si quelqu'un pouvais regarder et me dire ce quil en pense, et eventuellement comment amméliorer la chose. pas forcement sur celle la en particulier mais aussi de maniere général.

    j'en demande beaucoup, donc merci d'avance

    Mathieu
    ps: code trop gros long pour etre coloré, sorry.
    code sources:
    class_messagerie.php
    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
    <?php
    /* classe permettant d'envoyer des messages interne sur un site
     * les destinataires peuvent etre des individuels avec leur id sous forme de tableau($dest)
     * et /ou une liste de difusion ($dest_list) transformer en tableau par la function
     * 
     */
     
     
     class messagerie{
         var $level;
         var $id_membre;
         var $message;
         var $sujet;
         var $email;
         var $array_dest;
         var $site;
         var $i="0";
     
         function messagerie($host,$user,$passe,$db,$pseudo,$site){
             //connection
         $cx =    mysql_connect($host,$user,$passe);
                mysql_select_db($db,$cx);
        //verification que le membre existe (superflu, mais tans qua faire)
        $test_pseudo = mysql_query("SELECT id_membre FROM membre_info WHERE pseudo='$pseudo' AND actif='oui'");
        $test = mysql_fetch_array($test_pseudo);
        //si le membre est enregister et actif on declare sont id
        if(isset($test['id_membre']) AND is_numeric($test['id_membre']))
        $this->id_membre = $test['id_membre'];
        $this->pseudo = $pseudo;
        //un else aurais suffit mais bon
        if(!isset($test['id_membre']) OR !is_numeric($test['id_membre'])){
            echo '<div id="erreur">Vous n\'avez pas acces a cette fonction</div>';
            exit();
            }
         }
     
         function clean($str){
        //Supprime les balises HTML et PHP d'une chaîne
            $str=strip_tags($str);
        //Convertit tous les caractères éligibles en entités HTML et en utf8
            $str=htmlentities($str,ENT_QUOTES,'utf-8');
        //Supprime les espaces en début et fin de chaîne
            $str=trim($str);
        //echappe les guillemets
            $str=addslashes($str);
        //minuscule
            $str=strtolower($str);
            $str= nl2br($str);
        return($str);
        }//fin de function clean
     
     
        //insertion des messages dans la base
         function insert($message,$sujet,$destinataire,$pseudo,$id_membre){
             $req_rep ='insert into `membre_message` values'; 
            $req_rep .= '("","'.$destinataire.'", "'.$id_membre.'","'.$pseudo.'","'.date("Y-m-d").'", "'.date("G:i:s").'", 
    "'.$sujet.'", "'.$message.'","non")';
     
            $quer_rep=mysql_query($req_rep)or die(mysql_error());
     
         }
         //creation du tableau de destinataire
         //$dest_list est sous la forme id1*id2*id3* ...
         //$dest est deja un tableau
         function crea_dest($dest,$dest_list){
             if ($dest_list!="no"){
             //transforme $dest_list en tableau si il existe
             $array_dest1 = explode("*",$dest_list);
             //si en plus de la liste des membre on été selectionné
                 if(!empty($dest)){
                 $array_dest2 = $dest;
                 echo $array_dest2 ;
                 //jonction des deux tableau
                 $array_dest = array_merge($array_dest1,$array_dest2);
                 }
                 //sinon seulement la liste
                 else $array_dest = $array_dest1;
             }
             //si pas de liste
             if (($dest_list=="no") AND (!empty($dest))){
             $array_dest = $dest;
             }
         return $array_dest;
         }
     
         //envoi dune alerte par mail si case cocher
         function prev_by_mail($id_dest,$pseudo,$site){
         $envmail = mysql_query("select email from membre_info where id_membre='$id_dest'")or die(mysql_error());
        $mailing = mysql_fetch_array($envmail);
        $to = $mailing['email'];
         $subject = 'Nouveau message sur le site '.$site;
         $message = 'Le '.date('d/m').' a '.date('G:i').'; Vous avez recu un message de '.$pseudo.' sur le site '.$site."\r\n".'merci de ne pas repondre a ce mail';
         $headers = 'From: webmaster@'.$site.'' . "\r\n" .
         'Reply-To: webmaster@example.com' . "\r\n" .
         'X-Mailer: PHP/' . phpversion();
     
         mail($to, $subject, $message, $headers)or die("erreure de mail");
         }
         //fonction appelé pour lenvoi
         function envoi($message,$sujet,$dest,$dest_list,$mail,$site){
             //nettoyage des string
        $message = $this->clean($message);
        $sujet = $this->clean($sujet);
        //création du tableau de destinateur
        $array_dest = $this->crea_dest($dest,$dest_list);
        //comptage du nombre de destinataire
        $count = count($array_dest);
        //au cas ou
        if(!is_numeric($count)){
            echo '<div id="erreur">Pas de destinataire dans le tableau</div>';
            exit();
        }
        for ($i = "0"; $i < $count ; $i++) {
            echo '-'.$i.'-';
            $this->insert($message,$sujet,$array_dest[$i],$this->pseudo,$this->id_membre);
            if($mail=="yes") $this->prev_by_mail($array_dest[$i],$this->pseudo,$site);
        }
     
     
         }
     }//fin de class
     include('configuration.php');
     //tableau pour le teste
     $dest = array("1","2","3");
     //creation de lobjet
     $mess = new messagerie($host,$user,$passe,$db,"misterniark",$site);
     //envoie d'un message de teste
     $mess->envoi("merci a vous davoir lu mon code","merci de votre aide",$dest,"no","yes",$site)
    ?>

  2. #2
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Il est difficile de commenter un code sorti du contexte. Un code pourrait être parfait pour un certain besoin alors qu'il serait désastreux pour un autre. Néanmoins : (attention je sais pas faire les critiques positives )

    1. [Pb: Fort Couplage] Et si je n'ai pas envie d'utiliser mysql mais postgres ?
    => ta classe est couplée trop fortement à mysql

    2. [Pb: Faible Cohésion] Ta classe Messagerie offre une méthode clean qui permet de "nettoyer" une chaine, une méthode send qui permet d'envoyer des messages, une méthode insert qui permet d'insérer des messages en base, une fonction crea_dest ... Bref pour moi c'est un peu une classe fourre-tout et au final, je ne sais pas trop à quoi sert ta classe.

    3. [Pb: Clarté du code]
    - Il manque les commentaires des méthodes. (les commentaires à la sauce phpdoc sont très pratiques)
    - On ne sait pas si telle méthode est privée ou publique.
    - Le nom des méthodes / arguments / attributs est parfois mal choisi ("$i", "crea_dest", ...) et on ne sait pas à quoi ils servent ($site dans constructeur ?).
    - Mélange de français et d'anglais (clean/insert versus envoi/messagerie)
    - Parfois les commentaires sont poilants, du style "Oui là ça aurait été mieux de faire comme ça mais je vais pas me fatiguer alors je laisse comme c'est"
    - Indentation bizarroïde (peut-être du au copier coller dans le forum
    - Utilisation de chaines de caractères constantes à la place de booléens ("yes"/"no" versus true/false)

    Pour répondre à la question comment améliorer, ca risque d'être difficile car nous n'avons pas connaissance du contexte. En tout cas ce qui est sûr c'est que les concepts poo à la sauce PHP4 sont maitrisés, maintenant je pense qu'il faudrait prendre un peu de recul et penser au bénéfice de l'approche OO. Je pense notemment "réutilisabilité". En effet la classe dans l'état actuel est fortement couplée à mysql ainsi qu'à html ainsi qu'à d'autres paramêtres. Or je ne suis pas forcément en utf-8, je ne suis pas forcément derrière un navigateur ou je n'ai pas forcément mysql quand j'appelle ta classe.
    Faire un composant réutilisable n'est pas forcément facile à faire, souvent une utopie, mais autant essayer de pousser les concepts jusqu'au bout.

    Par exemple pour t'abstraire de mysql dans ton constructeur :
    Tu interroges mysql pour savoir si le membre existe (est-ce que c'est vraiment le role d'une messagerie?) et si il est actif. Au lieu de faire ça on va déléguer cette responsabilité à une autre classe, celle responsable des utilisateurs. Appelons-là UserManager :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class User {
       function isActif() {
       }
    }
    class UserManager {
       function &getUserByPseudo($pseudo) {
          ... 
       }
       ...
    }
    Maintenans le code du constructeur de messagerie devient beaucoup plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    function Messagerie {
       function Messagerie(&$user_manager, $pseudo, ....) {
          $user =& $user_manager->getUser($pseudo);
          if (!$user || !$user->isActif()) {
             echo 'Pas le droit !'
             exit();
          }
       }
       ...
    }
    C'est juste un exemple, à toi d'adapter et de voir si c'est vraiment pertinent en fonction de 1) tes besoins 2) ce que tu veux faire de cette classe (du style: elle déchire sa race grave je vais la revendre sur le net tellement qu'elle est trop bien).

    Je fini en disant qu'il n'est pas très sain de mettre un code de fin de script (exit) dans un constructeur.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 21
    Points : 14
    Points
    14
    Par défaut
    Merci pour ta reponse. Pour faire simple, je code uniquement pour moi, pas par choix mais car je nai parsonne a qui donner mes scripts. jai pris le concept de réutilisation du code dans le mauvais sens me semble t'il. mon but etais de pouvoir le reutiliser n'importe ou dans le site .

    tes commentaire me laisse penser que je n'ai pas compris "l'esprit" de la POO...
    Je vais essayer de mieux apprehender le concept.

    si jamis tu avais une classe (peu importe ce quel fais) qui pourrais me montrer la demarche je suis preneur.

    en tous cas merci.
    Mathieu

  4. #4
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Il n'y a pas 1 classe type. Chaque implémentation est propre à un besoin (c'est pour ça que je dis que faire un composant réutilisable est une utopie) surtout si on s'éloigne du bas niveau. Donc je ne suis pas en meure de te donner un exemple concret. Tu peux toujours regarder ZendFramework (PHP5) ou un autre framework qui respecterait l'esprit OO... peut-être http://www.phpwact.org

    L'approche Orientée Objet n'est pas une façon de programmer, mais une façon de concevoir une application.

    Et ce n'est pas parce que tu code dans ton coin que tu dois te permettre des légèretés, bien au contraire : dans un contexte commercial, tu es toujours à la bourre, tu codes comme un porc, tu testes à moitié alors que quand tu n'as pas de pression sur les épaules, tu peux te lacher, expérimenter des Design Patterns, faire des Tests Unitaires, bref... te faire plaisir

    Donc pas d'exemples type, mais on peu parler de ton code si tu veux...

  5. #5
    Membre averti Avatar de XtofRoland
    Profil pro
    Inscrit en
    Août 2005
    Messages
    357
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 357
    Points : 392
    Points
    392
    Par défaut
    Si je peux me permettre un conseil, lis le livre L'orienté Object de Eyrolles.
    exemple en C++, java (proche de php) C# et pyton ds la derniere editon.
    Le but de tout developpeur OO est de devenir une référence.
    Mon avatar est un ambigramme, les curieux peuvent le retourner ;-)
    Aider <> Faire a la place de!!!

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 21
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par Mr N.
    Donc pas d'exemples type, mais on peu parler de ton code si tu veux...
    Je crois que je vais te mennager et revenir te voir quand j'aurais avancé un peu histoire de pas te faire perdre ton temps.

    Je vais essayer de penser plus large pour cette classe. cette "appli" fonctionne deja en mode script, je l'ai codé cette semaine et je me suis appercu que c'est fonctionalité pouvais mettre utile a d'autre endroit, comme demander la corection d'un article dans mon module article par exemple, qui la me demande les fonctions d'insertion mais pas tous le bazard d'affichage de la boite d'envoi.

    ps: je n'ai pas compris (english not inside) les testes unitaires
    @XtofRoland : je pense que tu dois avoir raison, mais me lancer dans du c++ comme ca me fais froid dans le dos

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 21
    Points : 14
    Points
    14
    Par défaut
    si quand meme je ne comprend pas comment ca fonctionne ca:
    function Messagerie(&$user_manager, $pseudo, ....)
    je suppose quil faut instancier la classe avant ? quel est la fonction du "&" dans ton exemple ?
    Merci

  8. #8
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Test unitaires:
    http://www.design-up.com/methodes/te...res/index.html

    Néanmoins l'anglais est indispensable quand on se lance dans la prog. Surtout que l'anglais technique n'est pas très difficile à comprendre. Je suis personnelement incapable de tenir une conversation en anglais mais savoir déchiffrer/lire une doc technique m'a sorti du mauvais pas plus d'une fois

    Je te déconseille le c++. Touche plutot à du Java, du Ruby ou éventuellement du C# mais pas du c++ !

  9. #9
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Citation Envoyé par misterniark
    je suppose quil faut instancier la classe avant ? quel est la fonction du "&" dans ton exemple ?
    Merci
    Le & est un passage par référence. Un cauchemar en php4 http://fr.php.net/references

    Et oui il faut instancier la classe avant l'appel.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 21
    Points : 14
    Points
    14
    Par défaut
    voila... je pense avoir compris mais je suis pas sur pour la logique de la chose. peu tu me dire si c'est "mieux". moi j'avoue que c'est plus pratique comme ca effectivement.
    je ne me debarasse pas de mysql vu que c'est la seule que je connais et donc que j'utilise, j'en ferai abstraction quand je serai "grand"

    j'attend tes commentaire avant de continuer ( lire les message, detruire un message,...)
    class_messagerie.php
    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
    <?php
    /* classe permettant d'envoyer des messages interne sur un site
     * les destinataires peuvent etre des individuels avec leur id sous forme de tableau($dest)
     * et /ou une liste de difusion ($dest_list) transformer en tableau par la function
     * 
     */
     class connecting{
     
         function connect(){
             $this->host = $GLOBALS['host'];
             $this->user = $GLOBALS['user'];
             $this->passe = $GLOBALS['passe'];
             $this->db = $GLOBALS['db'];
             $this->cx_flag = mysql_connect($this->host,$this->user,$this->passe);
                 if (!$this->cx_flag) die('Impossible de se connecter : ' . mysql_error());
            $bd_select = mysql_select_db($this->db,$this->cx_flag);
                if(!$bd_select) die ('Impossible de sélectionner la base de données : ' . mysql_error());
            }
     
         function close($flag){
             return mysql_close($flag);
         }
     }
     
     class user{
         //$pseudo provient de $_SESSION['pseudo']
         function user($pseudo){
             //connection
         connecting::connect();
     
             //teste si le membre est bien enregister
         $test_pseudo = mysql_query("SELECT id_membre FROM membre_info WHERE pseudo='$pseudo' AND actif='oui'");
         $test_id_membre = mysql_fetch_array($test_pseudo);
         if(!$test_id_membre['id_membre']) die ('Vous n\'etes pas autoriser a accéder a cette fonctionalité');
     
         else $this->id_membre = $test_id_membre['id_membre'];
         connecting::close($this->cx_flag);
              }
     
          function user_info(){
              connecting::connect();
     
              $info_req = mysql_query("SELECT pseudo,email,level FROM membre_info where id_membre='$this->id_membre'") 
              or die(mysql_error());
              $info = mysql_fetch_array($info_req);
              $this->email = $info['email'];
              $this->level = $info['level'];
              $this->pseudo = $info['pseudo'];
              connecting::close($this->cx_flag);
          }
     
     }
     class clean{
         function clean($str,$utf8,$lower){
        //Supprime les balises HTML et PHP d'une chaîne
            $str=strip_tags($str);
        //Convertit tous les caractères éligibles en entités HTML et en utf8
            if($utf8==true)
                $str=htmlentities($str,ENT_QUOTES,'utf-8');
            if($utf8==false)
                $str=htmlentities($str,ENT_QUOTES);
        //Supprime les espaces en début et fin de chaîne
            $str=trim($str);
        //echappe les guillemets
            $str=addslashes($str);
        //minuscule
            if($lower==true)
                $str=strtolower($str);
            $str= nl2br($str);
        return($str);
        }//fin de function clean
     
     }
     class prev_by_mail{
     //envoi dune alerte par mail si case cocher
         function prev_by_mail($id_dest,$pseudo,$site){
         $envmail = mysql_query("select email from membre_info where id_membre='$id_dest'")or die(mysql_error());
        $mailing = mysql_fetch_array($envmail);
        $to = $mailing['email'];
         $subject = 'Nouveau message sur le site '.$site;
         $message = 'Le '.date('d/m').' a '.date('G:i').'; Vous avez recu un message de '.$pseudo.' sur le site '.$site."\r\n".'merci de ne pas repondre a ce mail';
         $headers = 'From: webmaster@'.$site.'' . "\r\n" .
         'Reply-To: webmaster@example.com' . "\r\n" .
         'X-Mailer: PHP/' . phpversion();
     
         //mail($to, $subject, $message, $headers)or die("erreure de mail");
         }
     }
     class messagerie{
     
     
         function messagerie($pseudo,$site){
         //teste lutilisateur et recupere ces info -classe user-     
         user::user($pseudo);
         user::user_info();
     
         //connection -classe connecting-
         connecting::connect();
        }
     
        //insertion des messages dans la base
         function insert($message,$sujet,$destinataire,$pseudo,$id_membre){
             $req_rep ='insert into `membre_message` values'; 
            $req_rep .= '("","'.$destinataire.'", "'.$id_membre.'","'.$pseudo.'","'.date("Y-m-d").'", "'.date("G:i:s").'", 
    "'.$sujet.'", "'.$message.'","non")';
     
            $quer_rep=mysql_query($req_rep)or die(mysql_error());
     
         }
         //creation du tableau de destinataire
         //$dest_list est sous la forme id1*id2*id3* ...
         //$dest est deja un tableau
         function crea_dest($dest,$dest_list){
             if ($dest_list!="no"){
             //transforme $dest_list en tableau si il existe
             $array_dest1 = explode("*",$dest_list);
             //si en plus de la liste des membre on été selectionné
                 if(!empty($dest)){
                 $array_dest2 = $dest;
                 echo $array_dest2 ;
                 //jonction des deux tableau
                 $array_dest = array_merge($array_dest1,$array_dest2);
                 }
                 //sinon seulement la liste
                 else $array_dest = $array_dest1;
             }
             //si pas de liste
             if (($dest_list=="no") AND (!empty($dest))){
             $array_dest = $dest;
             }
         return $array_dest;
         }
     
     
         //fonction appelé pour lenvoi
         function envoi($message,$sujet,$dest,$dest_list,$mail,$site){
     
             //nettoyage des string classe clean
        $message = clean::clean($message,$utf8=true,$lower=true);
        $sujet = clean::clean($sujet,$utf8=true,$lower=false);
     
        //création du tableau de destinateur
        $array_dest = $this->crea_dest($dest,$dest_list);
        //comptage du nombre de destinataire
        $count = count($array_dest);
        //au cas ou
        if(!is_numeric($count)){
            echo '<div id="erreur">Pas de destinataire dans le tableau</div>';
            exit();
        }
        for ($i = "0"; $i < $count ; $i++) {
            //juste pour la phase de dev
            echo '-'.$i.'-';
            $this->insert($message,$sujet,$array_dest[$i],$this->pseudo,$this->id_membre);
            if($mail=="yes") prev_by_mail::prev_by_mail($array_dest[$i],$this->pseudo,$site);
        }
        //deco
        connecting::close($this->cx_flag);
         }
     }//fin de class
     
     
     
     include('configuration.php');
     //tableau pour le teste
     $dest = array("1","2","3");
     //creation de lobjet
     $mess = new messagerie("misterniark",$site);
     //envoie d'un message de teste
     $mess->envoi("Merci a vous davoir lu mon code","Merci de votre aide",$dest,"no","yes",$site)
     
     
    ?>

  11. #11
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Je me répete il n'y a pas une "bonne" solution. Toutefois je pense que tu as trop décomposé ta classe.

    A priori, j'aurais fais comme ceci :
    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
     
    class User {
       var $pseudo;
       var $email;
     
       function User($pseudo, $email) {
          $this->pseudo = $pseudo;
          $this->email = $email;
       }
     
       function getEmail() {
          return $this->email;
       }
     
       /* static */ function &create($pseudo, $email) {
           //Requete sql pour insérer le user en base
           return new User($pseudo, $email);
       }
     
       /* static */ function retrieve($pseudo) {
          //Requete sql pour recherche le user $pseudo en base 
          return new User($row['pseudo'], $row['email']);
       }
     
       /* static */ // function update()
       /* static */ // function delete()
    }
     
    class Message {
       var $from;
       var $to;
       var $subject;
       var $body;
     
       function Message(&$from, &$to, $subject, $body) {
          $this->from =& $from;
          $this->to   =& $to;
          $this->subject = String::clean($subject);
          $this->body    = String::clean($body);
       }
     
       /* static */ function create(&$from, &$to, $subject, $body) {
          //Requete sql pour inserer en base le message
       }
       /* static */ //function retrieve()
       /* static */ //function update()
       /* static */ //function delete()
    }
     
    function String {
       function clean($str) {
          //nettoyage de $str
          return $str;
       }
    }
     
    function Messager {
       var $domain;
       function Messager($domain) {
          $this->domain = $domain;
       }
       function sendPrivateMessage(&$from, $tos, $subject, $body, $notify) {
          foreach($tos as $key => $nop) {
             Message::create($from, $tos[$key], $subject, $body);
             if ($notify) {
                $this->sendMail(
                   'webmaster@'. $this->domain,
                   $tos[$key]->getEmail(),
                   'Nouveau message sur le site '. $this->domain,
                   'Vous avez reçu un nouveau message de '. $from .' sur '. $this->domain
                );
             }
          }
       }
       function sendMail($from, $to, $subject, $body) {
          //Construction des headers et tout le tsoin tsoin 
          //pour envoyer un mail avec php
          mail(....);
       }
    }
    Et pour l'utiliser :
    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
     
    $notify = true;
     
    $subject = 'Sujet Passionnant !';
     
    $body = 'Trop cool';
     
    $from = User::retrieve('jean');
    if (!$from) {
       die ('Jean pas trouvé');
    }
     
    $tos = array();
     
    $jacques = User::retrieve('jacques');
    if ($jacques) {
       $tos[] =& $jacques;
    } else {
       die('Jacques pas trouvé');
    }
     
    $paul = User::retrieve('paul');
    if ($paul) {
       $tos[] =& $paul;
    } else {
       die('Paul pas trouvé');
    }
     
    if (count($tos)) {
       $messager =& new Messager('example.com');
       $messager->sendPrivateMessage($from, $tos, $subject, $body, $notify);
    }
    Il est selon moi important de sortir de la gestion des messages la gestion des utilisateurs (savoir si un pseudo existe ou pas)

    Attention je suis loin d'être un gourou. Ne pas tout prendre au pied de la lettre ce qui sort de mon cerveau embrumé.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 21
    Points : 14
    Points
    14
    Par défaut
    houuuuu c'est dur pour mon cerveau... je crois que je comprend la logique mais beaucoup moins la methode.

    je vais éplucher ca
    merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Besoins d'explications sur les classes de base et de son utilisation
    Par vandeyy dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 07/03/2014, 14h49
  2. POO : besoin de confirmation sur les attributs statics
    Par loic20h28 dans le forum Design Patterns
    Réponses: 2
    Dernier message: 21/01/2009, 08h40
  3. [POO] cherche tuto simple sur les classes php
    Par single dans le forum Langage
    Réponses: 4
    Dernier message: 29/04/2008, 01h07
  4. J'ai besoin d'aides sur les classes
    Par zizo89 dans le forum Langage
    Réponses: 2
    Dernier message: 30/12/2007, 13h52
  5. Besoin de conseil sur les classes
    Par SuperWeight dans le forum MFC
    Réponses: 1
    Dernier message: 04/06/2007, 21h44

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