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 :

isset(), !empty(), " and '


Sujet :

Langage PHP

  1. #1
    Membre très actif
    Homme Profil pro
    Apprenti perpétuel
    Inscrit en
    Novembre 2012
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Apprenti perpétuel

    Informations forums :
    Inscription : Novembre 2012
    Messages : 194
    Par défaut isset(), !empty(), " and '
    Bonjour à toutes et tous,

    Puis-je résumer ainsi ou suis-je inexact dans les 2 phrases suivantes?
    - La fonction isset() vérifie l'existence d'une variable peu importe si elle est vide ou pas.
    - La fonction !empty() vérifie si une variable n'est pas vide peu importe si elle existe ou pas.
    (Elle sera évidement vide si elle n'existe pas.)

    Je profite aussi de ce post pour faire le point sur l'usage des " ou '.
    Que disent les règles de l'art sur l'usage des " ou ' en php?

    Je vous joins ci-dessous mon petit bout de code php pour tester les 2 fonctions ci-dessus.
    J'utilise les " lors du script de la fonction isset() et j'utilise le ' lors du script de la fonction !empty()...
    Histoire de varier les plaisirs... ;-)
    J'y ai ajouté un 3ème petit script qui affiche la variable sans précaution particulière.
    J'ai séparé ces 3 petits scripts par des lignes horizontales pour bien les distinguer.

    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
     
    <?php echo '<!DOCTYPE html><html>
    <head><meta charset="utf-8" /><title>Test page</title></head>
    <body><h1>Test page.</h1><hr />';
    //------------------------------------------------------------
     
    if (isset($_GET['Try'])) {
      echo "\$_GET['Try'] is set. Value is: ".$_GET['Try'];
      var_dump($_GET['Try']);}
    else {echo "\$_GET['Try'] is not set.";}
     
    echo "<hr />"; //---------------------------------------------
     
    if (!empty($_GET['Try'])) {
      echo '$_GET[\'Try\'] is not empty. Value is: '.$_GET['Try'];
      var_dump($_GET['Try']);}
    else {echo '$_GET[\'Try\'] is empty.';}
     
    echo '<hr />'; //---------------------------------------------
     
    echo $_GET['Try'].'<hr /></body></html>'; ?>
    Je vous remercie de m'excuser pour ces quelques compressions de code.
    Je l'ai fait afin que cela puisse tenir facilement même dans un petit écran.

    Autre question pour déclarer une variable en php.
    Si c'est un nombre entier, j'ai compris qu'on peut simplement écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $Var=1; // par exemple
    Mais, si ce sont des caractères alphabétiques:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $Var="Abcd";
    // ou
    $Var='Abcd';
    Pourriez-vous me dire la différence exacte entre les 2 variables "$Var" ci-dessus?
    Merci.

  2. #2
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    ' et " permettent de délimiter une chaîne de caractères et sont donc fondamentalement équivalents.

    Essaie le code suivant et tu comprendras la différence.

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $toto = 'coucou';
    $var  = "ah que $toto";
    print $var."<br/>";
     
     
    $var  = 'ah que $toto';
    print $var."<br/>";

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    1- isset / empty : se référer à la doc.
    Voir surtout la définition de "vide" pour empty.


    2- Lire : Apostrophes ou guillemets : lesquels choisir ?

  4. #4
    Membre très actif
    Homme Profil pro
    Apprenti perpétuel
    Inscrit en
    Novembre 2012
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Apprenti perpétuel

    Informations forums :
    Inscription : Novembre 2012
    Messages : 194
    Par défaut
    Citation Envoyé par badaze Voir le message
    ' et " permettent de délimiter une chaîne de caractères et sont donc fondamentalement équivalents.

    Essaie le code suivant et tu comprendras la différence.
    Merci Badaze, il est évident que ta 2ème option affiche le nom de la variable $Toto et nullement son contenu.
    Le contenu de $Toto s'affiche dans la 3ème option que j'ai écrite.
    Ce ne sont là que des variantes de syntaxe.

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $toto = 'coucou';
    $var  = "ah que $toto";
    print $var."<br/>";
     
    $var  = 'ah que $toto';
    print $var."<br/>";
     
    $var  = 'ah que '.$toto;
    print $var."<br/>";

    Permets-moi de reposer ma question autrement.
    Je prends bonne note que " et ' sont fondamentalement équivalent et que cela semble simplement une orientation différente de syntaxe...
    Oui mais, n'y a t'il pas d'autres différences que celles syntaxiques?
    Selon les règles de l'art, laquelle des deux orientation syntaxiques est la meilleure ou la plus recommandée?

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Par défaut
    Il n'y a aucune différence. Lors de la compilation en opcode, les deux donnent exactement le même opcode qui est ensuite exécuté par PHP.

    Il n'y a pas de règles de l'art, choisis la technique qui te semble la plus lisible, en fonction du code, entre ',", concaténation ('ah que '.$toto), interpolation ("ah que $toto"), interpolation avec accolades ("ah que {$toto}"), (s)printf, heredoc, nowdow etc...

  6. #6
    Membre très actif
    Homme Profil pro
    Apprenti perpétuel
    Inscrit en
    Novembre 2012
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Apprenti perpétuel

    Informations forums :
    Inscription : Novembre 2012
    Messages : 194
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Bonjour,

    1- isset / empty : se référer à la doc.
    Voir surtout la définition de "vide" pour empty.


    2- Lire : Apostrophes ou guillemets : lesquels choisir ?
    1- La doc manque de pédagogie à mon gout... Et la doc parle de empty() et non de son opposé !empty().
    C'est pourquoi je reformulais avec mes mots et je voulais savoir si j'étais dans l'erreur. Sur ce point ton renvoi vers la doc ne m'aide guère.

    2- Merci beaucoup pour ce lien qui est très pédago et qui met bien en avant la différence.
    Je comprends maintenant que cela n'est qu'une question de lisibilité du code et que PHP nous offre ce fantastique choix entre guillemets ou apostrophes afin de mieux servir dans un contexte ou dans un autre.
    Je m'amuserai à faire ce comparatif: Si le terrain est boueux, c'est mieux de prendre des bottes.
    En revanche, si le terrain est propre, des chaussures classiques seront plus confortables.
    Ces deux modes ont en commun de nous éviter de marcher avec les pieds nus.

  7. #7
    Membre très actif
    Homme Profil pro
    Apprenti perpétuel
    Inscrit en
    Novembre 2012
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Apprenti perpétuel

    Informations forums :
    Inscription : Novembre 2012
    Messages : 194
    Par défaut
    Citation Envoyé par Tsilefy Voir le message
    Il n'y a aucune différence. Lors de la compilation en opcode, les deux donnent exactement le même opcode qui est ensuite exécuté par PHP.

    Il n'y a pas de règles de l'art, choisis la technique qui te semble la plus lisible, en fonction du code, entre ',", concaténation ('ah que '.$toto), interpolation ("ah que $toto"), interpolation avec accolades ("ah que {$toto}"), (s)printf, heredoc, nowdow etc...
    Merci Tsilefy pour ta réponse. Ok, c'est très claire. C'est comme bon nous semble.

    Pour isset() et !empty(), suis-je inexact en résumant ainsi:
    - La fonction isset() vérifie l'existence d'une variable peu importe si elle est vide ou pas.
    - La fonction !empty() vérifie si une variable n'est pas vide peu importe si elle existe ou pas.
    (Elle sera évidement vide si elle n'existe pas.)

  8. #8
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Après il faut aussi faire attention à ce qui est considéré comme ‘vide’.
    Pour la plupart des informaticiens je pense que vide équivaut à null (qui signifie sans valeur) et que 0 ou false sont des valeurs. Pour faire une analogie, 0 c’est une bouteille vide de liquide et null c’est une bouteille vide de liquide et d’air

  9. #9
    Invité
    Invité(e)
    Par défaut
    Je vais donc préciser mon propos initial, trop lapidaire.

    1- empty()
    La doc dit :
    empty — Détermine si une variable est vide
    Et précise :
    Les valeurs ci-dessous sont considérés comme étant vide :

    • "" (une chaîne vide)
    • 0 (0 en tant qu'entier)
    • 0.0 (0 en tant que nombre à virgule flottante)
    • "0" (0 en tant que chaîne de caractères)
    • NULL
    • FALSE
    • array() (un tableau vide)
    et c'est là où ça devient important, et où on peut comprendre une différence fondamentale entre :
    • isset()
    • et !empty()

    Exemples :
    $var = ''; ou $var = 0; ou $var = []; // (array) :
    Dans les 3 cas :
    • isset renvoie true, car la variable est bien "définie",
    • alors que !empty() renvoie false, car la variable est bien "définie", MAIS considérée "vide" (selon la définition ci-dessus)


    Donc :
    • isset() et !empty() sont différents
    • Mais empty() "englobe" isset() *



    * inutile d'écrire if( isset(...) && !empty(...) ), car if( !empty(...) ) suffit.
    Par contre, il ne faut pas utiliser !empty(...) si la variable peut/doit retourner une des valeurs considérées "vide".

    3-
    Citation Envoyé par Tsilefy Voir le message
    Il n'y a aucune différence. ...
    SI, il y a une différence essentielle (déjà identifiée) :
    • echo 'Voici la $var'; : $var N'est PAS interprétée par PHP (et est donc traitée comme chaîne de caractères
    • echo "Voici la $var"; : $var EST interprétée par PHP en tant que variable PHP (et vaut la valeur définie)
    Dernière modification par rawsrc ; 20/02/2019 à 08h46.

  10. #10
    Membre Expert

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    SI, il y a une différence essentielle (déjà identifiée) :
    Exactement, et Olivier l'a déjà pointée ("différence syntaxique") - syntaxique étant sa définition, pas la mienne :-)

    D'où sa question
    Citation Envoyé par olivierdauxais
    Oui mais, n'y a t'il pas d'autres différences que celles syntaxiques?:

  11. #11
    Invité
    Invité(e)
    Par défaut
    Ce n'est pas juste une "différence syntaxique", c'est une "différence fonctionnelle" (comme je l'ai indiqué).

    Une autre différence notable est la "coloration syntaxique", qui est, à mon avis, moins lisible avec des ".
    echo "Voici la $var";.

    Pour ma part, je préfère écrire :
    echo 'Voici la ' . $var; ou echo "Voici la " . $var; (en " sortant" la variables des '...' ou "...")
    La "coloration syntaxique" facilite visuellement le débugage.

    Les "raccourcis faciles" sont des "pièges à c... débutants !


    Pour conclure : à chacun d'utiliser la syntaxe qui lui convient le mieux, en toute connaissance de cause.
    Dernière modification par Invité ; 20/02/2019 à 01h01.

  12. #12
    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 : 48
    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
    @jreaux62
    Pour bénéficier de la coloration syntaxique dans les chaînes avec interprétation des variables, il te suffit d'utiliser "{$var}", d'ailleurs quand vous utilisez cette syntaxe, le parseur de PHP a un token spécifique T_CURLY_OPEN.
    Enfin cette syntaxe vous permet d'exécuter du code à la génération des chaînes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $hsc     = function($p): string { return htmlspecialchars($p, ENT_QUOTES, 'utf-8'); };  // fonction d'échappement des caractères dangereux
    $implode = function(array $p): string { return implode(null, $p); };
     
    $var = '"<script></script>"';
    $nav = [1, 2, 3];
    echo <<<html
    {$hsc($var)}
    <nav>
        <ul class="nav nav-pills">
            {$implode($nav)}
        </ul>
    </nav>
    {$implode($details)};
    html;
    Personnellement, je n'utilise que cette syntaxe (sauf à de très rares exceptions)
    Un peu de lecture par et par là-bas

  13. #13
    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 : 48
    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
    Je vous invite à lire le post de John relatif aux performances du moteur quant à la concaténation des chaînes de caractères : très instructif

  14. #14
    Membre très actif
    Homme Profil pro
    Apprenti perpétuel
    Inscrit en
    Novembre 2012
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Apprenti perpétuel

    Informations forums :
    Inscription : Novembre 2012
    Messages : 194
    Par défaut
    Merci Badaze,
    J'adore les analogies car elles sont souvent très pédagogiques.
    Toute la difficulté est de trouver la bonne analogie.
    Tu mentionnes aussi la valeur NULL, c'est intéressant.

    Merci jreaux62 pour tes précisions.
    Oui Tsilefy, ma définition de "syntaxique" est plutôt floue.
    Merci aussi rawsrc.

    Du coup, j'ai complété mon petit script de ce début de post avec la fonction !is-null() pour tester ces différentes valeurs dans le langage PHP:
    Pour ceux qui comme moi s'interroge sur le sens précis de ces fonctions, je vous invite à copier / coller ce script pour des essais.

    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
     
    <?php echo '<!DOCTYPE html><html>
    <head><meta charset="utf-8" /><title>Test page</title></head>
    <body><h1>Test page.</h1><hr />';
    //------------------------------------------------------------
     
    if (isset($_GET['Try'])) {
      echo "\$_GET['Try'] is set. Value is: ".$_GET['Try'];
      var_dump($_GET['Try']);}
    else {echo "\$_GET['Try'] is not set.";}
     
    echo "<hr />"; //---------------------------------------------
     
    if (!empty($_GET['Try'])) {
      echo '$_GET[\'Try\'] is not empty. Value is: '.$_GET['Try'];
      var_dump($_GET['Try']);}
    else {echo '$_GET[\'Try\'] is empty.';}
     
    echo '<hr />'; //---------------------------------------------
     
    if (!is_null($_GET['Try'])) {
      echo "\$_GET['Try'] is not null. Value is: ".$_GET['Try'];
      var_dump($_GET['Try']);}
    else {echo "\$_GET['Try'] is null.";}
     
    echo '<hr />'; //---------------------------------------------
     
    echo $_GET['Try'].
     
    '<hr />'; //--------------------------------------------------
     
    echo '</body></html>'; ?>

    Si la variable "Try" n'est pas déclaré dans l'URL:
    => La fonction isset répond logiquement "not set".
    => La fonction !empty répond logiquement "empty".
    => Avec la fonction !is_null, php renvoit un message d'erreur.
    => L'affichage de "Try" avec "echo" renvoit aussi un message logique d'erreur.

    Si la variable "Try" est déclaré sans valeur dans l'URL: ?Try
    => La fonction isset répond logiquement "set".
    => La fonction !empty répond logiquement "empty".
    => La fonction !is_null répond "Not null".
    => L'affichage de "Try" est vide.

    Si la variable "Try" est déclaré avec la valeur "0" dans l'URL: ?Try=0
    => La fonction isset répond logiquement "set valeur 0".
    => La fonction !empty répond "empty".
    => La fonction !is_null répond "Not null valeur 0".
    => L'affichage de "Try" affiche "0".

    Enfin, si la variable "Try" est déclaré avec la valeur "1" dans l'URL: ?Try=1
    => La fonction isset répond logiquement "set valeur 1".
    => La fonction !empty répond "not empty valeur 1".
    => La fonction !is_null répond "Not null valeur 1".
    => L'affichage de "Try" affiche "1".

    Cette notion de vide est subtile. Pour moi, la valeur 0 n'est pas vide.
    En effet, $Var=0; la variable Var a la valeur 0.
    Avec: $Var=''; la variable Var est déclarée mais vide.

    C'est troublant pour moi et bon à retenir que la fonction empty() de php considère la valeur 0 (et les autres mis en avant par jreaux62) comme vide.
    Mais, à l'inverse de !is_null(), la fonction !empty() à l'avantage de ne pas retourner de message d'erreur si la variable est inexistante.

    Quant aux guillemets et aux apostrophes, j'ai bien compris que ce choix est à la convenance de chacun mais...
    Derrière leur équivalence, il y a une véritable différence non négligeable.
    Les guillemets interpreteront une variable incluse alors que les apostrophes ne le feront pas.
    Y a t'il d'autres différences fonctionnelles tout aussi importantes qui dépendent de cette variance syntaxique?

  15. #15
    Membre Expert

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    Je vous invite à lire le post de John relatif aux performances du moteur quant à la concaténation des chaînes de caractères : très instructif
    Merci pour ce lien!
    Celui de Nikita Popov (l'un des développeurs du moteur PHP) l'est encore plus, bien que plus ancien :-)

Discussions similaires

  1. [1.x] Empty module and/or action after parsing the URL
    Par etoileweb dans le forum Symfony
    Réponses: 3
    Dernier message: 12/05/2011, 18h57
  2. différence entre !isset et empty.
    Par sam01 dans le forum Langage
    Réponses: 3
    Dernier message: 20/10/2006, 16h35
  3. [MySQL] Formulaire avec isset ou empty
    Par guillaume2vo dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 11/08/2006, 22h27
  4. Checkbox, empty, isset
    Par Anduriel dans le forum Langage
    Réponses: 1
    Dernier message: 11/07/2006, 22h23
  5. [Tableaux] la difference entre isset et empty
    Par ghita269 dans le forum Langage
    Réponses: 2
    Dernier message: 23/10/2005, 01h07

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