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 :

Passer une fonction en paramètre mais sans l'executer


Sujet :

Langage PHP

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

    Informations forums :
    Inscription : Mars 2004
    Messages : 23
    Points : 23
    Points
    23
    Par défaut Passer une fonction en paramètre mais sans l'executer
    Bonjour,

    Je m'arrache les cheveux depuis hier soir sur un problème pas évident à trouver sur Google...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function un($val){
     echo $val; 
     return new stdClass();
    }
     
    function deux($fn){
     echo "test"
      print_r($fn);
    }
     
    deux(un("a"));

    Ce qu'il se passe :
    La fonction un('a') est executé, puis le résultat est passé à la fonction deux()

    Ce que j'aimerais :
    La fonction un('a') soit passée (sans être exécuté) à la fonction deux(), un('a') sera executé lors de l'appel du print_r par exemple

    Pouquoi faire ça ????
    Pour implémenter un système de cache. Concrètement, la fonction deux() va vérifier si le résultat de un('a') est en cache. Si c'est en cache, elle n’exécutera pas un('a')



    Pourtant je sais que c'est possible, par exemple c'est le fonctionnement de la fonction remember() du cache apc du framework laravel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public function remember($key, $minutes, Closure $callback){
    ...
    }
    Ici ils demandent une fonction anonyme (Closure) ... C'est peut être une piste mais j'aimerais éviter


    Merci

  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
    Tu peux simplement passer le nom de la fonction dans une chaine, comme pour usort :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function un($val){
     echo $val; 
     return new stdClass();
    }
     
    function deux($fn, $var){
     echo "test";
      print_r($fn($var));
    }
     
    deux('un', 'a');

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

    Informations forums :
    Inscription : Mars 2004
    Messages : 23
    Points : 23
    Points
    23
    Par défaut
    Merci

    Ta solution n'est pas celle que j'ai retenue, mais elle m'a bien inspiré.

    Je passe par une fonction intermediaire qui à pour seul but de mettre l'appel à la fonction un() dans une fonction anonyme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function un($params){
    $val = function() use ($params)
             {
                  return new Class($params);
             };
     
       return  $val;
    }
    Ainsi $val contient la fonction anonyme et non pas le resultat de la fonction. Pour executer, je dois faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $result = un('a');
    $result();

    Merci

  4. #4
    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
    Si ça marche, c'est l'essentiel

    donc ?

Discussions similaires

  1. Réponses: 16
    Dernier message: 26/05/2009, 13h32
  2. Passer une fonction en paramètre, sans delegate
    Par deejay2221 dans le forum C#
    Réponses: 8
    Dernier message: 26/03/2009, 20h22
  3. Réponses: 15
    Dernier message: 02/08/2007, 11h17
  4. Passer une fonction en paramètre ...
    Par Freeze dans le forum C++Builder
    Réponses: 2
    Dernier message: 14/10/2005, 16h51
  5. [Conception] Passer une fonction en paramètre
    Par pejay dans le forum Langage
    Réponses: 9
    Dernier message: 09/12/2004, 13h58

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