Précédent   Forum des professionnels en informatique > PHP > Langage > Contribuez
Contribuez Proposez vos articles, cours, tutoriels, FAQ, sources, etc. pour PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/09/2007, 14h37   #1
Expert Confirmé
 
Avatar de sekaijin
 
Femme
Urbaniste
Inscription : juillet 2004
Messages : 1 428
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 48
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Urbaniste
Secteur : Santé

Informations forums :
Inscription : juillet 2004
Messages : 1 428
Points : 2 815
Points : 2 815
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 :
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 :
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 :
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 :
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);
      ...
   }
sekaijin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2007, 00h20   #2
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
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 :
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2007, 17h13   #3
Expert Confirmé
 
Avatar de sekaijin
 
Femme
Urbaniste
Inscription : juillet 2004
Messages : 1 428
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 48
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Urbaniste
Secteur : Santé

Informations forums :
Inscription : juillet 2004
Messages : 1 428
Points : 2 815
Points : 2 815
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
sekaijin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2007, 20h31   #4
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
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.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h33.


 
 
 
 
Partenaires

Hébergement Web