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 :

paramètres ayant une valeur par défaut passés à la fonction : comment s'y retrouver ? [PHP 7]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 495
    Billets dans le blog
    1
    Par défaut paramètres ayant une valeur par défaut passés à la fonction : comment s'y retrouver ?
    Bonjour,

    voici une fonction dont certains paramètres ont une valeur par défaut, ce qui suppose que ceux-ci ne sont pas forcément appelés :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     function save( $appli_name,$activate_date, $platform, $sesaid, ?string $deactivate_date = null, ?int
        $id =null, ?int $idupdate = null)
    dans cette fonction, les 3 derniers paramètres ont une valeur par défaut ($par5, $par6, $par7). Supposons maintenant que j'appelle cette fonction en ne lui passant que le paramètre $par6 (donc pas $par5 ni $par7)
    save('appli1', '2021-07-17','plat1', 'SESA27384', $id_lic);. Comment savoir qu'il s'agit du paramètre $par6 et qu'il faut utiliser leur valeur par défaut pour les paramètres $par5 et $par7 ? Comme dans mon cas, le paramètre $par5 est une date et que les 2 suivants sont des entiers, dans l'appel de la fonction save, le code considère que le paramètre passé à la fonction est une date, donc il est perdu...

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 710
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 710
    Par défaut
    vous ne pouvez pas sauter un argument au milieu, les valeurs par défaut sont toujours pour les dernières arguments.
    https://www.php.net/manual/fr/functi...uments.default

    ensuite, depuis php 8, il est possible d'utiliser des arguments nommés donc cela vous aidera peut-être dans votre code
    https://www.php.net/manual/fr/functi...amed-arguments

    une autre possibilité est de passer une liste en argument de la fonction et c'est le code interne de votre fonction qui essayera de déterminer à quoi correspond chaque valeur.

  3. #3
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 994
    Par défaut
    Attention aussi quand tu te retrouves avec des fonctions qui ont beaucoup de paramètres: c'est le signal qu'il faut aborder les choses autrement. Passer une liste de paramètres (un tableau associatif, ou bien un ou plusieurs objets) comme le suggère mathieu est une solution, mais ça peut aussi être un objet dont les propriétés seraient une partie de tes paramètres, et doté d'une méthode save(). Ça peut aussi être le signe que ta fonction essaie de faire trop de chose et qu'il serait plus sage de la remplacer par deux autres fonctions ou plus.

  4. #4
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 495
    Billets dans le blog
    1
    Par défaut
    Merci pour vos réponses.

    @mathieu : je suis intéressé par cette fonctionnalité des paramètres nommés (mon PHP est en 8.02). J'ai fait (à mon avis) ce qui est indiqué :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public function save( appli_name: $appli_name,
                              activate_date: $activate_date,
                              platform: $platform,
                              sesaid: $sesaid,
                              deactivate_date: ?string $deactivate_date = null,
                              id: ?int $id = null,
                              idupdate: ?int $idupdate = null
                            ) 
     
     
    $res = $ref_license->save(appli_name: 'appli1', activate_date:'2021-07-17',platform: 'plat1', sesaid: 'SESA27384',deactivate_date: NULL,
            id: $id_lic, idupdate: NULL);
    mais
    Parse error: syntax error, unexpected token ":", expecting variable in C:\projets\ticket_rawsrc\model\license\table\LI_license.php on line 120
    De quoi ça peut venir ?

    @Cosmo : tu me proposes de découper la méthode save. Quel découpage me proposes-tu ?
    Code php : 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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    public function save( appli_name: $appli_name,
                              activate_date: $activate_date,
                              platform: $platform,
                              sesaid: $sesaid,
                              deactivate_date: ?string $deactivate_date = null,
                              id: ?int $id = null,
                              idupdate: ?int $idupdate = null
                            ) {
            //les
            // paramètres avec valeur par défaut doivent être placés à la fin
            try
            {
                $ppp = new PDOPlusPlus();
     
                $ppp->startTransaction();
     
                $res = $this->getAP_PL_ident();
     
                $ap_ident = $res['ap_ident'];
                $pl_ident = $res['pl_ident'];
     
                if (!$id)
                { //si pas sesaid pour cet appli_name en bdd
     
                    if ($deactivate_date)
                    {
                        $sql_insert = <<<sql
    INSERT INTO `li_license`
    (
    `LI_activate_date`,
    `LI_deactivate_date`,
    `PL_ident`,
    `AP_ident`,
    `US_sesa_OWNLIC`)
    VALUES (
         {$ppp($activate_date)}, 
         {$ppp($deactivate_date)},  
         {$ppp($pl_ident)},
         {$ppp($ap_ident)}, 
         {$ppp($sesaid)}
    )
    sql;
                    }
                    else
                    {
     
                        $sql_insert = <<<sql
    INSERT INTO `li_license`
    (
    `LI_activate_date`,
    `PL_ident`,
    `AP_ident`,
    `US_sesa_OWNLIC`)
    VALUES (
         {$ppp($activate_date)}, 
         {$ppp($pl_ident)}, 
         {$ppp($ap_ident)}, 
         {$ppp($sesaid)}
    )
    sql;
                    }
                    $id = $ppp->insert($sql_insert);
                    dispResult::${$nb_insert}++;
     
                    return $id;
                }
                elseif ($idupdate)
                { //LI_ident <- sesaid et application_name
                    $sql = <<<sql
    SELECT LI_ident from li_license LI 
    JOIN own_owner_license OWN ON LI.US_sesa_OWNLIC = OWN.US_sesa_OWNLIC
    JOIN ap_application APP ON LI.AP_ident = APP.AP_ident;
    sql;
                    $li_ident = $ppp->select($sql)[0]['LI_ident'];
     
                    if ($deactivate_date)
                    {
                        $sql = <<<sql
    UPDATE `li_license`
    SET
    `LI_activate_date` = {$ppp($activate_date)},
    `LI_deactivate_date` = {$ppp($deactivate_date)},
    `PL_ident` = {$ppp($pl_ident)},
    `AP_ident` = {$ppp($ap_ident)},
    `US_sesa_OWNLIC` = {$ppp($sesaid)}
    WHERE `LI_ident` = {$ppp($li_ident)};
    sql;
                    }
                    else
                    {
                        $sql = <<<sql
    UPDATE `li_license`
    SET
    `LI_activate_date` = {$ppp($activate_date)},
    `PL_ident` = {$ppp($pl_ident)},
    `AP_ident` = {$ppp($ap_ident)},
    `US_sesa_OWNLIC` = {$ppp($sesaid)}
    WHERE `LI_ident` = {$ppp($li_ident)};
    sql;
                    }
     
                        $exec = $ppp->update($sql);
     
                        DispResult::${$nb_update}++;
     
                        return (bool)$exec;
                    }
     
                $ppp->commit();
                }
     
     
            catch (\Exception $e) {
                $ppp->rollback();
            }
     
        }

    NB : pour les accès à la BDD, j'utilise l'excellente classe PDOPlusPlus de rawsrc.

  5. #5
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 994
    Par défaut
    Citation Envoyé par laurentSc Voir le message
    Merci pour vos réponses.

    @mathieu : je suis intéressé par cette fonctionnalité des paramètres nommés (mon PHP est en 8.02). J'ai fait (à mon avis) ce qui est indiqué :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public function save( appli_name: $appli_name,
                              activate_date: $activate_date,
                              platform: $platform,
                              sesaid: $sesaid,
                              deactivate_date: ?string $deactivate_date = null,
                              id: ?int $id = null,
                              idupdate: ?int $idupdate = null
                            ) 
     
     
    $res = $ref_license->save(appli_name: 'appli1', activate_date:'2021-07-17',platform: 'plat1', sesaid: 'SESA27384',deactivate_date: NULL,
            id: $id_lic, idupdate: NULL);
    Non, c'est à l'appel de la fonction (ou méthode) que tu peux utiliser la syntaxe avec les deux points. La définition de la fonction (ou méthode) doit se faire comme d'habitude, et c'est le nom des variables des paramètres qui détermine le nom des labels lors de l'appel de la fonction. Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function toto(int $hocus, string $pocus):bool {
        //...
    }
     
    toto(pocus: 'blablabla', hocus: 7);
    @Cosmo : tu me proposes de découper la méthode save. Quel découpage me proposes-tu ?
    Ça c'est à toi de le savoir, car même avec le code de ta fonction, ce que tu cherches à faire reste opaque. C'est toi qui sait ce que tu cherches à faire et ce que tu manipules. C'est à toi de trouver.

  6. #6
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 495
    Billets dans le blog
    1
    Par défaut
    Merci ; je m'étais trompé, ne connaissant pas cette fonctionnalité. Et comme ça fonctionne, j'irai pas plus loin...

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/08/2013, 09h57
  2. Réponses: 2
    Dernier message: 02/09/2011, 11h29
  3. Réponses: 0
    Dernier message: 07/10/2010, 21h11
  4. [Doctrine] Update d'un champ ayant une valeur par défaut
    Par louveteau02 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 17/03/2010, 12h51
  5. [Requete] Comment donner une valeur par défaut à un paramètre
    Par soforever dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 14/05/2007, 10h21

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