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 :

Factorisation du code


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Janvier 2013
    Messages : 40
    Points : 22
    Points
    22
    Par défaut Factorisation du code
    Bonjour à tous

    Voilà mon souci :

    j'ai 2 fonctions qui ont en partie le même code et j'aurais aimé savoir si c'était possible de factoriser ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function fonction_A(){
    des réquetes sql et plein de if permettant de savoir à quel groupe appartient mon utilisateur, qui abouti à une variable $usergroupe que jutilise pour afficher mon menu
    }
     
    function fonction_B(){
    tout le même code au début, copié collé de la fonction A, aboutissant également à ma $usergroupe que jutilise cette fois pour pour autre chose
    }
    et je voudrais savoir si je pouvais faire une fonction_C avec tout mon code aboutissant à ma $usergroupe pour appeler cette variable directement en A et B plutôt que d'avoir 2 fois le même code dans les fonction A et B au début.


    pour simplifier si c'est pas clair :
    si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function fonction_C()
    { bla bla 
    return $usergroupe
    }
    function fonction_A()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    { fonction_C();
    $toto = $usergroupe;
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function fonction_B()
    { fonction_C();
    $tutu = $usergroupe;
    }
    ça peut marcher ? j'ai fais des test sans succès donc j'aimerais juste savoir si sur un plan théorique c'est possible d'appeler une fonction dans une fonction ou si je peux arrêter de m'enfoncer dans cette piste

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    C'est la raison d'être des fonctions : mettre un traitement en commun de façon à pouvoir l'utiliser à plusieurs endroits.
    Un exemple alakon : je veux une fonction qui renvoie le double de $a+$b et une qui renvoie la moitié de $a+$b.
    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
    // retourne la somme de $a et $b
    function fonctionA($a, $b) {
        return $a+$b;
    }
     
    // retourne la double de la somme de $a et $b
    function fonctionB ($a, $b) {
        $result = fonctionA($a, $b);
        return 2*$result;
    }
     
    // retourne la moitié de la somme de $a et $b
    function fonctionC($a, $b) {
        return functionA($a, $b)/2;
    }

  3. #3
    Membre expérimenté Avatar de nathieb
    Homme Profil pro
    DevOps
    Inscrit en
    Mai 2004
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 058
    Points : 1 532
    Points
    1 532
    Par défaut Les classes
    Bonjour,

    Pour ce genre de spécification on utilise la notion de classe, avec l'héritage:
    La classe commune avec ses notions générales et les méthodes qui vont bien, en relation avec tout ce que tu peux factoriser du groupe A et B. Il existe d'autres solutions plus élégantes (Design Pattern composition) , chaque chose en son temps ...

    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
     
    abstract class GroupCommon{
       protected $users;
       protected $acl;
       /* Le contructeur 
       public __construct(){
            //intialisation de la classe
       }
       /* Les getters et les setters de mes champs*/
       public function getNom(){
         ....
         return $this->nom;
      }
      public function setNom($nom){
          $this->nom=$nom;
      }
      public function getAcl(){ .....
     
      public function getUsers(){ ....
     
     
      }//fin de la classe
    On crée une classe qui étend les notions de la première, bien sûr toutes les fonctions communes sont déjà implémentées, par contre on crée ce que l'on nomme des fonctions abstraites qu'on force à implémenter quand on hérite ... chercher notion sur un moteur de recherche ...
    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
      function UserInGroupA() extends GroupCommon
        {
           private $usergroupe :
           //je n'implémente que les fonctions nouvelles
           ou celles qui ont besoins d'une définition
           particulière 
           function IsInGroupA($user){
                
           }
        }
    
       function UserInGroupB() extends GroupCommon
        {
           private $usergroupe :
           //je n'implémente que les fonctions nouvelles
           ou celles qui ont besoins d'une définition
           particulière 
           function IsInGroupB($user){
                
           }
        }
    
     
    
    C'est UNE solution, il en existe d'autres, mais le passage par des fonctions, cela ressemble à du PHP4.

    Olivier

  4. #4
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Janvier 2013
    Messages : 40
    Points : 22
    Points
    22
    Par défaut
    Merci à vous 2 pour votre rapidité de réponse et pour avoir pris le temps de m'aider même sur une question aussi bête

    @Celira : merci j'ai capté grâce à toi, que comme un idiot, je ne donnais pas de variable à ma fonction quand je la rappelais -_- ! je faissais juste "fonction();" au lieu de "$variable = fonction();" ... ça marche nickel là

    @nathieb : merci pour tes conseils et ton explication j'ai déjà quelques notions d'héritages (je prend des cours de c# à coté) mais je savais pas qu'on pouvais l'appliquer au php ! Mais ayant un petit projet (j'ai juste un fonction.php pour mes fonctions qui sont très peu nombreuses) j'ai préféré suivre le conseil de Celira

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

Discussions similaires

  1. factorisation de code
    Par calagan99 dans le forum ASP.NET
    Réponses: 7
    Dernier message: 21/05/2007, 10h00
  2. [C++] Factorisation de code
    Par xterminhate dans le forum C++
    Réponses: 6
    Dernier message: 07/11/2006, 17h21
  3. factoriser du code
    Par grabriel dans le forum Langage
    Réponses: 3
    Dernier message: 26/10/2006, 16h00
  4. Réponses: 7
    Dernier message: 01/08/2006, 12h58
  5. Réponses: 4
    Dernier message: 06/11/2003, 11h37

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