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 :

Cloner une fonction


Sujet :

Langage PHP

  1. #1
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut Cloner une fonction
    Bonjour j’ai une ptp comment je peux cloner ou assigner une fonction dans une variable sans passer par create_function
    comme avec delphi
    Code delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    function somme(x,y:integer):integer;
      begin
        result:=x+y  ;
      end;
    procedure test();
    var
    varfunc : function(t,n:integer):integer;
    outs:integer;
    begin
         varfunc:= somme;
         outs:= varfunc(15,12) ; //outs=27
         showmessage(format('%d',[outs]));
    end;

  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 : 37
    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
    Points : 3 972
    Points
    3 972
    Par défaut
    Bonjour,
    je ne sais pas si le clonage est possible, mais, je ne vois pas dans quel contexte, en PHP, tu nécessiterais de cloner une fonction ?

    Tu veux peut-être parler de la meme fonction mais avec des signatures différentes ? Je crois que ce n'est pas possbile en PHP

    Tu veux peut-être faire deux appels de fonction ?

    $val1 = Somme(17,12);
    $val2 = Somme(8,91);


    Sinon il faudra que tu te penches sur la création d'une classe.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    Tournes toi vers les callbacks pour faire quelque chose d'équivalent mais de bien moins joli syntaxiquement.
    http://www.php.net/manual/fr/functio...-user-func.php

  4. #4
    Membre habitué
    Inscrit en
    Août 2004
    Messages
    497
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 497
    Points : 194
    Points
    194
    Par défaut
    le clonage existe
    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
    Exemple de duplication d'objets
     
     
    <?php
    class SubObject 
    {
      static $instances = 0;
      public $instance;
     
      public function __construct() {
        $this->instance = ++self::$instances;
      }
     
      public function __clone() {
        $this->instance = ++self::$instances;
      }
    }
     
    class MyCloneable 
    {
      public $objet1;
      public $objet2;
     
      function __clone() 
      {    
        // Force la copie de this->object, sinon
        // il pointera vers le même objet.
        $this->object1 = clone($this->object1);
      }
    }
     
    $obj = new MyCloneable();
     
    $obj->object1 = new SubObject();
    $obj->object2 = new SubObject();
     
    $obj2 = clone $obj;
     
     
    print("Objet original :\n");
    print_r($obj);
     
    print("Objet cloné :\n");
    print_r($obj2);
     
    ?>

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    d'objet pas de fonction, ni de méthode.

  6. #6
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Bonjour et merci pour ces reponse je savais que la reponse est dans une meandre de php voici cet exemple pour expliquer le problème de vitesse et encombrement

    Methode 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    	$operation='/';
    	 foreach ($input as $keys=>$vals)
    	 	{
    		 switch($operation)
    	 		{
    				case '+':$out[]=$vals[0]+$vals[1];break; 
    				case '-':$out[]=$vals[0]-$vals[1];break; 
    				case '*':$out[]=$vals[0]*$vals[1];break; 
    				case '/':$out[]=$vals[0]/$vals[1];break; 
    			}
    		}
    Methode 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    $tab=array( 
    		'+'=>create_function('$a,$b','return $a+$b;'),
    		'-'=>create_function('$a,$b','return $a-$b;'),
    		'*'=>create_function('$a,$b','return $a*$b;'),
    		'/'=>create_function('$a,$b','return $a/$b;')
    	   );
     
    	$operation='/';
    	$fonction=$tab[$operation];
    	foreach ($input as $keys=>$vals)
    	 	{
    			$out[]=$fonction($vals[0]+$vals[1]);
    		}
    Mais create_function va créer des nouvelles fonctions et pas les cloner
    je vais essayer avec call_user_func et merci encore

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    Mais en faits pourquoi vouloir cloner une fonction ?

    Sinon à la lecture de ton code, et de mon oubli des fonctions lambda de PHP, as tu essayé clone($fonction) ?
    En ce sens artotal avait peut être raison, mais comme j' n'ai pas encore le plaisir d'utiliser les fonctions lambda je ne sais pas si sa fonctionne.

    Même si je reste un peu perplexe sur le besoin de cloner une fonction.

  8. #8
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Oui je veux cloner ces fonction dans $fonction et si il n'existe une solution je serai obligé pour supprimer mes fonctions et les recréer avec create_function
    Voici un autre exemple(objet script pour pagination) qui marche bien si je ne change pas les fonctions je dois utiliser deux boucles

    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
     
     function  add_pn($type,$a,$v)
      {
        $outs=array();
        $functions=array(
             'prev'=>array(
                'exp'=> create_function('$a,$b,&$c','return pow($a,$b);'),
                'opr'=> create_function('$a,$b','return $a-$b;'),
                'com'=> create_function('$a,$b','return max($a,$b);'),
                'equ'=> create_function('$a,$b','return ($a > $b)? true:false;')
    		      ),
            'next'=>array(
                'exp'=> create_function('$a,$b,&$c','$c=$a*$c; return $c/10;'),
                'opr'=> create_function('$a,$b','return $a+$b;'),
                'com'=> create_function('$a,$b','return min($a,$b);'),
                'equ'=> create_function('$a,$b','return ($a < $b)? true:false;')
                         )
    		   );
        foreach ($functions[$type] as $key => $val) ${$key}=$val;
        $np=$this->mRows*$this->pnum;
        $log=1;
        while($v>=0)
        {
          $ww= $exp(10,$v,$log);
          $value=$com($a, $opr($this->pnum,$ww));
          if ($equ($this->pnum,$a))
             {
               $nk=$opr($np,($this->mRows*$ww));
               $this->add(
               max(1,$nk+1).'-'.min($nk+$this->mRows,$this->tRows),
               $value,
               sprintf("[%s]",$opr($this->pnum,$opr($ww,1)))
                        );
              };
    	$v--;
        }
    }

  9. #9
    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 : 37
    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
    Points : 3 972
    Points
    3 972
    Par défaut
    C'est sympa, mais quel est l'avantage par rapport à une déclaration statique de ces fonctions ? Surtout si elles sont utilisées ailleurs que dans cette fonction, sinon je vois bien mais meme niveau performance ca apporte quelque-chose ?

  10. #10
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Excuser moi il y a une erreur de syntaxe ici ‘opérateur + ’
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $out[]=$fonction($vals[0]+$vals[1]);
    Voici le bon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $out[]=$fonction($vals[0],$vals[1]);
    Mais en faits pourquoi vouloir cloner une fonction ?
    le problème est visuel si je ne le fait pas je dois répéter mon code pour chaque fonction en delphi c’est impeccable

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    Ben je rejoint ThomasR, cloner des fonctions du scope global n'apporte, de mon propre avis, pas grd chose.
    Si je doit dupliquer une fonction en ce qui me concerne, c'est pour en adapter le scope genre un handler qui s'execute pour un certain evenement, en js, jamais eu le besoin en php.

    Pour en revenir à tes moutons,
    Tu pourrais remplacer tes fonctions lambda par des noms de fonctions s'exécutant dans le scope global.

    Au lieu de :
    'exp'=> create_function('$a,$b,&$c','return pow($a,$b);')
    ==>
    'exp'=> "exponentiel"

    Au lieu de :
    $ww= $exp(10,$v,$log);
    ==>
    $ww= call_user_func_array($val,array(10,$v,$log)/* là j'ai un doute sur les args*/);


    En gros sa donnerait sa comme changement. Pas de clonage puisque les fonctions sont déclarées dans le scope globale.

    Après j'aime pas plus ma solution que cela. Mais plus besoin de cloner.

    Voila,
    a plus

  12. #12
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Merci c'est trouve
    http://www.php.net/manual/fr/functio...func.php#78949
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $fun = "strlen";
    echo $fun('longeur_de_chaine');
     // Affiche 17

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

Discussions similaires

  1. Comment chronométrer une fonction
    Par 323 dans le forum Pascal
    Réponses: 3
    Dernier message: 19/03/2003, 20h24
  2. Appeler une fonction avec/sans parenthèses
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 29/12/2002, 18h48
  3. [VBA-E] avec une fonction value
    Par laas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/11/2002, 13h22
  4. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14
  5. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 13h39

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