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

Contribuez / Téléchargez Sources et Outils PHP Discussion :

Paramètres de fonction et constantes


Sujet :

Contribuez / Téléchargez Sources et Outils PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut Paramètres de fonction et constantes
    Lorsqu'on utilise des constantes comme valeur par défaut d'une fonction on est tenté de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function maFonction($param = MA_CONSTANTE) {...
    Le problème est que si la constante n'est pas définit on passe alors en paramètre la valeur "MA_CONSTANTE" ce qu'i n'est pas obligatoirement ce que l'on souhaite.

    une solution est de garantir la définition de la CONSTANTE si elle n'existe pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (!defined('MACONSTATE')) define ('MA_CONSTATE', 'valeur par défaut');
    function maFonction($param = MA_CONSTANTE) {...
    On a alors la garantie que la constante existe. mais ce n'est pas toujour sufisant.
    En effet en suposant que la constate soit un paramètre de configuration. il y a des chance pour que le fichier contenant la définition des paramètre et celui contenant la fonction ne soient pas les mêmes.
    Si le fichier contenant la fonction est chargé avant celui contenant la configuration MA_CONSTANTE ne sera pas correctement configuré
    elle aura toujours la valeur contenue dans le fichier de la fonction.

    voici une petite fonction pour fixer le paramètre:
    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
       /**
          @function fixConstantParam()
          @param $&$param Référence du parametre à valoriser
          @param $constante nom de la constante contenant la valeur par defaut.
          @param $hide Masquer la valeur de la constante.
          @param $silence ne pas afficher de notices
          @return NULL retourne toujours null;
       */
       function fixConstantParam(&$param, $constant, $hide = false, $silence = true) { 
          $notice = "";
          $trace = debug_backtrace();
          if (is_null($param)&&defined($constant)) { 
             $param = constant($constant);
             if (!$silence) {
                $notice = 'Utilisation de la constante de configuration ';
                $notice.= $constant;
                if (!$hide) $notice.= ' : <b>'.constant($constant).'</b>';
                $notice.= ' dans '.$trace[1]['class'].'::'.$trace[1]['function'];
                $notice.= ' in '.$trace[1]['file'].' line ' . $trace[0]['line'];
                $notice.= '<br /> throw ';
                trigger_error($notice, E_USER_NOTICE);
             }
          } 
          if (is_null($param)&&!defined($constant)) {
             $notice = 'La constante : <b>';
             $notice.= $constant;
             $notice.= '</b> n\'est pas definie dans ';
             $notice.= $trace[1]['class'].'::'.$trace[1]['function'];
             $notice.= ' à <b>'.$trace[1]['file'].'</b> ligne <b>' . $trace[0]['line'];
             $notice.= '</b><br /> throw ';
             trigger_error($notice, E_USER_ERROR); 
          }
          return NULL; 
       }
    cette fonction s'utilise ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       function Base ($Serveur = NULL, $Port = NULL, $Base = NULL, $Utilisateur = NULL, $Passe = NULL) {
          fixConstantParam($Serveur,     'CFG_DB_SERVER');
          fixConstantParam($Port,        'CFG_DB_PORT');
          fixConstantParam($Base,        'CFG_DB_DATABASE');
          fixConstantParam($Utilisateur, 'CFG_DB_USERNAME');
          fixConstantParam($Passe,       'CFG_DB_PASSWORD', true);
          ...
       }

  2. #2
    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
    Par défaut
    Pour rappel, changer le mode d'erreur pendant le développement permet d'identifier ce genre de détails. PHP permet de faire du code propre aussi bien que du code très laid, charge à nous (les développeurs) de produire le code adéquat.

    Ta méthode est intéressante sous certaines conditions, mais je ne recommande pas de l'utiliser pour des applications en production. Il faut pouvoir compter sur la présence des constantes au moment opportun, sans à avoir à vérifier leur état.

    Depuis PHP5, le mode d'erreur recommandé lors du développement est :

  3. #3
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut
    Oui E_STRICT est la bonne solution
    mais malheureusement de nombreuse entreprises sont encore sous php4 qui ne le supporte pas

    ce code ne change absolument rien en production
    si ton paramètre doit avoir une valeur par défaut défini par une constant (de conf) et que celle-ci n'est pas définie tu va planter à l'exécution donc vaut mieux identifier l'erreur là où elle se trouve plutôt que de laisser une portion de code se vautrer sans qu'on puisse facilement retrouver l'erreur
    en php 5 j'aurais mis un trow

    quant à savoir si ça va arrêter ou pas l'appli c'est comme en php5 si on veut que l'appli ne plante pas il faut gérer les erreur à l'appel. try catch en php5 et error handler en php4

    a+jyt

  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
    Par défaut
    Les "entreprises" qui n'ont pas encore migré devraient sincèrement se mettre au travail tout de suite, car dès l'année prochaine PHP4 ne sera plus débogué par le PHP Group... PHP 4 est mort, tandis que PHP 5 est presque en train de passer le relai à son successeur.

    Je ne comprends pas pourquoi on continue de développer en PHP 4, c'est une mauvaise idée, au contraire il faut porter nos efforts sur le port des applis existantes vers PHP 5.

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/10/2010, 10h21
  2. liste énumérée de const. perso comme paramètre de fonction
    Par batou22003 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 13/12/2005, 20h37
  3. Paramètres de fonction : pointeurs ou valeurs ?
    Par Xandar dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 30/11/2005, 16h50
  4. Retrouver les valeurs des paramètres des fonctions d'une DLL
    Par Bernard Martineau dans le forum Langage
    Réponses: 6
    Dernier message: 08/11/2005, 10h42
  5. Paramètre de fonction
    Par Reynald dans le forum Débuter
    Réponses: 6
    Dernier message: 05/01/2005, 21h48

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