Lorsqu'on utilise des constantes comme valeur par défaut d'une fonction on est tenté de faire
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.
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:
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
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);
...
} |
Partager