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] Fonction à nombre de paramètres dynamique


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 10
    Points : 7
    Points
    7
    Par défaut [POO] Fonction à nombre de paramètres dynamique
    Bonjour,

    Je fais du PHP depuis plus d'un an, mais me voilà devant un obstacle que je n'arrive pas à franchir. Probablement, ce type de fonctions est impossible, mais je tente une dernière fois en vous posant la question.

    En effet, je cherche à créer une fonction qui devra recevoir un nombre de paramètres variable mais en même temps elle devra retourner les valeurs par référence:
    • Réception d'un nombre de paramètres quelquonque
    • Traitements des paramètres
    • Retour des valeurs par référence
    Si on prend un exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    # Ici se trouve ma fonction-mystère machin,
    # dont la syntaxe m'est inconnue ou n'existe pas
    # Elle ne fait qu'ajouter un plus (+) au début de la chaîne de caractères
     
    $var1='toto';
    $var2='coco';
    machin($var1,$var2);
    echo "$var1 et $var2!";
    // Ce script devrait afficher:
    // « +toto et +coco! »
    ?>
    Si le nombre de paramètres était invariable, j'aurais pu écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    function machin(&$var1,&$var2)
    {
      $var1='+'.$var1;
      $var2='+'.$var2;
    }
    ?>
    Pour autoriser un nombre d'arguments variable, j'utiliserais plutôt la fonction func_get_args. Mais celle-ci ne fait que retourner un tableau des valeurs passées à la fonction, donc pas question de valeurs de retour par référence...

    Voilà le problème. On pourrait évidement contourner l'obstacle, en passant tous les paramètres dans un tableau, mais cela ne convient guère. Je vous serai très reconnaissant si vous trouvez une solution à ce problème.

    Merci en tout cas

  2. #2
    Membre éprouvé Avatar de macbook
    Inscrit en
    Février 2006
    Messages
    838
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 838
    Points : 1 009
    Points
    1 009
    Par défaut
    J'aurais bien une solution, mais cela n'utilise pas le passage de variables par référence.

    Je passe mes variables dans une chaine en paramètre et j'analyse la chaine avec parse_str() au sein de la fonction, ce qui permet d'envoyer autant de paramètres que l'on souhaite, et dans l'ordre que l'on souhaite.

    Est-ce une piste pour toi ?
    Consultant idéaliste.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Merci pour cette idée. Effectivement, cela peut être une piste intéressante. Pour l'instant je fais presque pareil:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    machin($opts,'$var1,$var2');
    Ma fonction machin délimite les noms des variables, les rend globales, modifie leur contenu et puis le script se termine, tout ça via eval(). Avec parse_str(), c'est déjà une méthode plus intélligente. La fonction pourrait d'ailleurs retourner une chaîne de caractères du même format, qui sera analysée par parse_str() dans le script. Mais cela pose un autre problème: devoir encoder les variables.

    Le seul but est de rendre l'utilisation des fonctions la plus simple possible. Je souhaite un codage propre, en effet...

  4. #4
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    Une suggestion toute bête : passer un tableau ou un objet (capsule) en paramètre ?

  5. #5
    Invité
    Invité(e)
    Par défaut
    Boarf, pourquoi se compliquer la vie

    http://fr2.php.net/manual/fr/function.func-get-args.php
    http://fr2.php.net/manual/fr/function.func-get-arg.php
    http://fr2.php.net/manual/fr/function.func-num-args.php

    voila, tu as tout ce que tu veux

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Kirkis
    Une suggestion toute bête : passer un tableau ou un objet (capsule) en paramètre ?
    Citation Envoyé par Digimag
    Voilà le problème. On pourrait évidement contourner l'obstacle, en passant tous les paramètres dans un tableau, mais cela ne convient guère. Je vous serai très reconnaissant si vous trouvez une solution à ce problème.
    Citation Envoyé par bibi.skuk
    http://fr2.php.net/manual/fr/function.func-get-args.php
    http://fr2.php.net/manual/fr/function.func-get-arg.php
    http://fr2.php.net/manual/fr/function.func-num-args.php
    Citation Envoyé par Digimag
    Pour autoriser un nombre d'arguments variable, j'utiliserais plutôt la fonction func_get_args. Mais celle-ci ne fait que retourner un tableau des valeurs passées à la fonction, donc pas question de valeurs de retour par référence...
    Je n'étais pas clair?

  7. #7
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    D'un point de vue sémantique, tous tes paramètres auront la même signification. C'est là que tu n'es pas clair.
    Cela dit, il est vrai que j'ai zappé cette phrase de ton message où tu évoques le tableau...
    En quoi cela ne te convient-il pas ?

    Perso, je trouve cette solution (du tableau) bien plus propre et plus organisée que d'envoyer un nombre inconnu de paramètres.

  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
    +1 kirkis
    un joli tableau associatif, ca permet d'avoir en plus une simulation de parametres nommés 8)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ma_fonction(array('id' => 12, 'nom' => 'Toto', 'prenom' => 'Titi'));

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Digimag
    Je n'étais pas clair?
    visiblement si, mais mes yeux pas encore très ouverts...

    Mais le tableau reste le plus propre (et marche surtout) dans ce cas la...

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Propre, certes, mais il ne me convient pas comme je l'ai mentionné. Vous voulez savoir pourquoi?

    Dans ce cas je vais devoir vous raconter ma vie: je suis un grand amateur des grosses bibliothèques en PHP qui vous font tout le boulot fastidieux et vous facilitent la vie. Je n'aime pas taper beaucoup du texte pour un maigre résultat, je n'aime pas me répétér trois fois de suite non plus. Il existe des boucles, des fonctions, des classes pour cela.

    Mon but est de faire du codage propre, sobre, et rendre l'utilisation des fonctions la plus simple. Cette fonction-ci, très précisement, elle est chargée de sécuriser / désécuriser les variables passées en arguments. Très pratiques pour une intéraction formulaire/mysql/email. Au lieu d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $_POST['message']=htmlspecialchars(stripslashes($_POST['message'));
    $_POST['email']=htmlspecialchars(stripslashes($_POST['email'));
    $_POST['sujet']=htmlspecialchars(stripslashes($_POST['sujet'));
    $_GET['page']=htmlspecialchars(stripslashes($_GET['page'));
    $result=htmlspecialchars(stripslashes($result));
    J'aurais (et vous aussi?) préféré:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    varsecure('cS',$_POST['message'],$_POST['email'],$_POST['sujet'],$_GET['page'],$result);
    La différence est énorme à mes yeux. 'cS' sont des paramètres, c veut dire htmlspecialchars, s veut dire slashes. Une minuscule sécurise les données (ex: addslashes), une majuscule fait le contraire (ex: stripslashes)...

    Mais bon, PHP a aussi ses limites, si ce n'est pas possible, tant pis.

  11. #11
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Ah, en ce cas je comprends mieux

    Cependant, si l'on regarde la doc de function_get_args(), voici le dernier commentaire :
    Citation Envoyé par [url=http://fr2.php.net/manual/fr/function.func-get-args.php#59423
    Nathan Ostgard[/url]]If you're using PHP5, the variable number of argument functions all return the objects by reference - and not a copy of the object, as this leads you to believe.
    Cela semble répondre à tes questions de disponibilité...

  12. #12
    Membre éprouvé Avatar de macbook
    Inscrit en
    Février 2006
    Messages
    838
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 838
    Points : 1 009
    Points
    1 009
    Par défaut
    Citation Envoyé par Mr N.
    +1 kirkis
    un joli tableau associatif, ca permet d'avoir en plus une simulation de parametres nommés 8)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ma_fonction(array('id' => 12, 'nom' => 'Toto', 'prenom' => 'Titi'));
    Dans mon exemple je pensais surtout à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
    ma_fonction ( 'id=12&nom=Toto&prenom=Titi' ) ; 
    ?>
    Ou bien dans ton cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    varsecure ( 'action=cS&POST=true&GET=true&result=' . $result ) ;
    Puis avec parse_str tu récupère le tout.
    Consultant idéaliste.

  13. #13
    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 Digimag
    préféré:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    varsecure('cS',$_POST['message'],$_POST['email'],$_POST['sujet'],$_GET['page'],$result);
    La différence est énorme à mes yeux. 'cS' sont des paramètres, c veut dire htmlspecialchars, s veut dire slashes. Une minuscule sécurise les données (ex: addslashes), une majuscule fait le contraire (ex: stripslashes)...

    berk berk berk. Chacun voit midi à sa porte, mais si tu trouves ca propre libre à toi
    pourquoi ne pas utiliser des flags au lieu de parser une string illisible pour le premier venu ?

    Sinon pour ton besoin, function_get_args et consors ont l'air d'être ce que tu recherches.

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Merci de toutes vos réponses (et avec un peu de retard).

    Je ne sais plus pourquoi je posais toutes ces questions. Mais j'aimerais savoir ce que sont ces flags dont parle Mr. N. Quelqu'un sait ?

    Merci d'avance

    P.-S. Il n'y a pas de champ "Jabber" dans le profil ? Beurk !

Discussions similaires

  1. [Toutes versions] Comment faire une requête avec nombre de paramètres dynamiques?
    Par BornToBe dans le forum VBA Access
    Réponses: 6
    Dernier message: 24/04/2012, 19h23
  2. Fonction à nombre de paramètres variable
    Par Noufnouf dans le forum Scheme
    Réponses: 1
    Dernier message: 06/04/2011, 11h01
  3. Réponses: 2
    Dernier message: 05/09/2007, 09h22
  4. Réponses: 11
    Dernier message: 30/03/2006, 15h39
  5. Réponses: 9
    Dernier message: 24/05/2005, 16h34

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