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 :

Utilisation des fermetures


Sujet :

Langage PHP

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 319
    Par défaut Utilisation des fermetures
    Salut !
    J'aimerais vous soumettre un problème. Voici sans plus attendre l'énoncé...
    Au début de certaines fonctions j'utilise le bout de code suivant pour définir des options par défaut, écrasées ensuite par les options passées en arguments.
    Après, pour me simplifier la vie, je définis autant de variables locales qu'il y a d'options présentes, histoire de me simplifier l'écriture de la suite. L'ennuie avec tout ça c'est que c'est vite répétitif et je trimballe souvent ce bout de code. Parfois ça prend même presque autant de place que le reste de la fonction que j'écris...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function cook($options = null) { 
        $options = array_merge(array( // default options 
            'fruit' => 'apple', 
           &nbsp'vegetable' => 'peas' 
        ), $options); 	 
        forEach($options as $option => $value) { 
            $$option = $value; 
        }  
        print("Let's cook some $fruit with $vegetable!"); 
    }
    Donc, sauriez-vous si, à l'aide des closures ou bien autre chose à quoi je n'aurais pas encore pensé, il serait possible d'automatiser ces quelques instructions ? On pourrait écrire quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function cook($options = null) { 
        settleOptions($options, array('fruit' => 'apple', 'vegetable' => 'peas'));  
        print("Let's cook some $fruit with $vegetable!"); 
    }
    Dommage qu'on n'ait pas de define à la C++...

  2. #2
    Membre Expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Par défaut
    Bonjour,

    Tu peux utiliser la fonction extract qui sert à çà :

    http://fr.php.net/extract

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    function cook($options = null){
        if($options !== NULL) extract($options);
    }
    Concernant tes paramètes par défaut, tu les écrases à chaque fois avec ta technique, pourquoi ne pas les stipuler directement dans la signature de la fonction ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function cook($options = array('fruit' => 'orange', 'legume' => 'patate')){
        extract($options); 
        echo $fruit;
    }

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 319
    Par défaut
    Ah, chouette, merci pour extract, je ne connaissais pas !

    Pour l'autre point, je ne peux pas le généraliser comme tu le proposes car le langage impose que les valeurs par défaut soient des constantes. Or, dans le cas qui suit comme dans un grand nombre de cas finalement, les valeurs par défaut proviennent d'appels à des fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function cook($options = array('fruit' => Orchard::getDefaultFruit(), 'legume' => 'patate')) { ... }

  4. #4
    Membre Expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Par défaut
    Bonjour,

    Tu peux faire comme ceci alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    function cook(array $options){
        $default_options = array(
           'fruit' => Orchard::getDefaultFruit()
        );
        foreach($default_options as $i => $v){
            if(isset($options[$i])) $default_options[$i] = $options[$i];
        }
        extract($default_options);     
        echo $fruit;
    }

  5. #5
    Membre chevronné Avatar de BornBanane
    Homme Profil pro
    dev
    Inscrit en
    Mars 2007
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Mars 2007
    Messages : 284
    Par défaut
    Salut,

    En reprenant ce qu'a fait ThomasR, j'aurais fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function cook(array $options){
        $default_options = array(
           'fruit' => Orchard::getDefaultFruit()
        );
        extract(array_merge($default_options,$options));     
        echo $fruit;
    }
    Bon courage à toi .

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 319
    Par défaut
    Ouép, ou même encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    extract($options = array_merge(array( // default options 
        'fruit' => Orchard::getDefaultFruit(), 
        'vegetable' => 'peas' 
    ), $options));
    Mwahah

    Merci !


    Sinon, si on en revient aux fermetures, peut-on d'une manière ou d'une autre modifier les variables du scope appelant lorsqu'on est dans une fonction ?

  7. #7
    Membre chevronné Avatar de BornBanane
    Homme Profil pro
    dev
    Inscrit en
    Mars 2007
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Mars 2007
    Messages : 284
    Par défaut
    En utilisant le passage par référence.
    Il faut alors mettre un & devant le nom du paramètre de la fonction : voir ici

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 319
    Par défaut
    Pardon, j'ai mal posé ma question... ^^'

    Je voulais dire "créer", pas modifier.

Discussions similaires

  1. [C#] La bonne utilisation des WinForms (ouverture-Fermeture)
    Par Harry dans le forum Windows Forms
    Réponses: 28
    Dernier message: 03/08/2005, 12h39
  2. [CR8.5] Utilisation des codes barre
    Par Robert dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 20/01/2005, 17h13
  3. utilisation des sockets sous windows
    Par Tupac dans le forum Réseau
    Réponses: 2
    Dernier message: 21/12/2002, 19h24
  4. [Crystal Report] Utilisation des vues de sql serveur
    Par Olivierakadev dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 15/11/2002, 18h44
  5. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 17h01

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