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 :

Constante ou variable ?


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2016
    Messages : 18
    Par défaut Constante ou variable ?
    Bonjour à tous, étant débutant j'ai besoin de votre aide sur un sujet :
    SonarQube ( logiciel qui mesure la qualité du code ) me demande d'utiliser une constante au lieu de dupliqué 3 fois ( $_GET["docname"] ) sur le code suivant :

    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
    35
    <?php
     
    $servername = "http://blabla";
     
    if( isSet( $_GET["docname"] ) ) {
    	$path = $servername;
     
    	switch( strtolower($_GET["docname"]) ) {
     
    		case 'guide_tarifaire_res':
    			$path .= "/path/to/something";
    			break;
     
    		case 'guide_tarifaire_pro':
    			$path .= "/path/to/something";
    			break;
     
    		default:
    			header("location: http://www.exemple.com");
    			break;
    	}
    	$pdfname = $_GET["docname"].".pdf";
    	$pdf = file_get_contents($path);
    	$len = strlen($pdf);
     
     
        header("Content-type: application/pdf");
    	header("Content-Length: $len");
    	header("Content-Disposition: inline; filename=$pdfname");
    	echo $pdf;
    } else {
    	header("location: http://www.exemple.com");
    }
     
    ?>
    Dois-je faire une constante comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    define("DOCNAME", $_GET["docname"]);
    et ensuite l'appelée comme ceci : et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pdfname = DOCNAME.".pdf";
    ?

    Ou bien niveau performance serait-il plus judicieux d'utilisé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const DOCNAME = $_GET["docname"];
    mais il me semble que c'est possible uniquement pour une classe, ce qui n'est pas mon cas.

    Ou bien vu que je redéfinis dans le switch la variable en question , une constante n'est pas appropriée et je devrais utilisé une variable classique ?

    Merci d'avance !

  2. #2
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    Moi je vote simple variable.
    Une constante en PHP n'a (à mon avis) vraiment de sens que dans un fichier de config que l'on incluerait partout...
    Là, le correcteur de code te dit juste que tu peux ranger ton $_GET, variable d'environnement, dans une variable tout court...

    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
    35
    <?php
     
    $path = "http://blabla";
     
    if( ! empty( $_GET["docname"] ) ) {
      $docname=strtolower($_GET["docname"]));
     
    	switch($docname) {
     
    		case 'guide_tarifaire_res':
    			$path .= "/path/to/something";
    			break;
     
    		case 'guide_tarifaire_pro':
    			$path .= "/path/to/something_else";
    			break;
     
    		default:
    			header("location: http://www.exemple.com");
          break;
    	}
    	$pdfname = $docname.".pdf";
    	$pdf = file_get_contents($path);
    	$len = strlen($pdf);
     
     
      header("Content-type: application/pdf");
    	header("Content-Length: $len");
    	header("Content-Disposition: inline; filename=$pdfname");
    	echo $pdf;
    } else {
    	header("location: http://www.exemple.com");
    }
     
    ?>
    A part ça, si tu tenais à une constante, en PHP, c'est ainsi qu'on les manipule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //dans un fichier de config
    define('MAX_JEUX',10);
    //sur n'importe quel script
    include('config.php');
    if(defined('MAX_JEUX')){
       for($i=1;$i<=MAX_JEUX;$i++){
          echo 'Tu peux encore jouer !<br/>';
       }
    }
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  3. #3
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    un logiciel de mesure de qualité du code qui te conseille de remplacer une valeur en provenance d'un tableau super global comme $_GET par une constante, est bon à jeter à la poubelle.

    Par contre, il ne te dit pas comment améliorer ton code par hasard ?
    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
    <?php
     
    $servername = "http://blabla";
    $paths      = [
        'guide_tarifaire_res' => "/path/to/something",
        'guide_tarifaire_pro' => "/path/to/something" 
    ];
     
    if (isset($_GET['docname'], $paths[$_GET['docname']])) {
        $path    = $servername.$paths[$_GET['docname']];
        $pdfname = $_GET["docname"].".pdf";
        $pdf     = file_get_contents($path); // t'es sûr que ton fichier existe au moins ?
        $len     = strlen($pdf);
     
        header("Content-type: application/pdf");
        header("Content-Length: {$len}");
        header("Content-Disposition: inline; filename={$pdfname}");
        echo $pdf;
    } else {
        header("location: http://www.exemple.com");
        exit;   // toujours mettre un exit; après un header(location:)
    }
    // ne jamais fermer la balise <?php quand un fichier ne contient que du code PHP

  4. #4
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Ce serait sans doute une bonne idée de lire l'erreur exacte dans Sonar (qui est souvent accompagnée d'un exemple pour mieux comprendre ce qui cloche), plutôt que de partir dans toutes les directions.
    En l'occurrence, ce qui pose problème à Sonar, c'est la duplication d'une chaine, pas d'une variable.
    Donc, ce qu'il attend, c'est quelque chose : define("DOCNAME", "docname"); à l'utiliser par : $_GET[DOCNAME].
    L'idée étant que si tu veux changer la valeur de cette chaine, il est plus simple de changer la valeur de la constante à un seul endroit (sans changer le nom de la constante) plutôt que d'avoir à changer la chaine partout dans le code et risquer d'en oublier une.

    String literals should not be duplicated

    Duplicated string literals make the process of refactoring error-prone, since you must be sure to update all occurrences.

    On the other hand, constants can be referenced from many places, but only need to be updated in a single place.
    https://rules.sonarsource.com/php/RSPEC-1192
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

Discussions similaires

  1. Utilisation Constante avec variable
    Par benbrisefer dans le forum VBA Access
    Réponses: 1
    Dernier message: 01/02/2011, 11h05
  2. Constantes dans variable
    Par tsunamichups dans le forum Langage
    Réponses: 3
    Dernier message: 16/08/2010, 11h20
  3. constantes et variables de classe
    Par lasrevinu dans le forum C#
    Réponses: 9
    Dernier message: 15/04/2010, 10h22
  4. [Débutant] Require, constantes et variables.
    Par Rakken dans le forum Langage
    Réponses: 11
    Dernier message: 23/04/2009, 17h50
  5. Fonctions constantes et variables constantes
    Par TabrisLeFol dans le forum Langages de programmation
    Réponses: 11
    Dernier message: 13/03/2006, 07h37

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