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 :

Variable dans les chaînes


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2009
    Messages
    256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : Février 2009
    Messages : 256
    Points : 79
    Points
    79
    Par défaut Variable dans les chaînes
    Bonjour,
    quand on inclus des variables dans les chaînes, il y a qqch que je ne comprends pas. Si par exemple je définis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $titre = $_SESSION['title'];
    la variable de session contient une chaîne. Alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "ici c'est le $titre<BR>";
    fonctionne bien, car le caractère < informe le parser sans ambiguïté que le nom de variable s'arrête là, bon.
    Mais si j'écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "ici c'est le $_SESSION['title']<BR>";
    là j'obtiens le message
    syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE
    . Pourquoi est-ce que là le parser proteste ?
    Il faut carrément faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "ici c'est le {$_SESSION['title']}<BR>";
    La ceinture et les bretelles ?

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    D'autres syntaxes possibles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "ici c'est le $_SESSION[title]<BR>";
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo 'ici c\'est le ' . $_SESSION['title'] . '<BR>';
    Je ne pense pas qu'il y ait une motivation derrière ça. Le parser est construit comme ça, c'est tout.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2009
    Messages
    256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : Février 2009
    Messages : 256
    Points : 79
    Points
    79
    Par défaut
    Le parser est construit comme ça, c'est tout.
    Eh ben c'est pas fort de la part des développeurs :-(

    Merci.

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    il y a une bonne raison derrière la ceinture et les bretelles : c'est la possibilité d'injecter directement des formes complexes au sein des chaînes de caractères, en particulier des classes avec leurs méthodes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $text = "texte de test {$instance->method(...)} fin de texte";
    D'ailleurs, la notation {$ possède un token spécifique dans le parser PHP : T_CURLY_OPEN.

    Pour te finir, les notations heredoc et nowdoc sont très pratiques et surtout bien plus performantes que l'inclusion de fichiers, avec une telle approche, l'injection de formats complexes au sein de la vue prend tout son sens.

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    oui mais cela n'explique pas pourquoi on ne peut pas écrire
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2009
    Messages
    256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : Février 2009
    Messages : 256
    Points : 79
    Points
    79
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    les notations heredoc et nowdoc sont très pratiqu
    En effet, et c'est ce que j'utilise, mais quand je pose une question dans un forum, j'essaie toujours de circonscrire le problème à sa plus simple expression.

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2009
    Messages
    256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : Février 2009
    Messages : 256
    Points : 79
    Points
    79
    Par défaut
    Citation Envoyé par sabotage Voir le message
    oui mais cela n'explique pas pourquoi on ne peut pas écrire
    C'est en effet ce qu'on dit ici : http://php.net/manual/fr/language.types.array.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Ceci ne fonctionnera pas, et en résultera une erreur d'analyse, comme ceci :
    // Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'
    // Ceci arrive lors de l'utilisation d'une supergloables dans les chaînes
    print "Hello $arr['fruit']";
    print "Hello $_GET['foo']";
    Mais on n'explique pas pourquoi. En fait, la notation $arr[fruit] n'est qu'une tolérance en l'absence de constante « fruit » pour remplacer $arr['fruit'] qui serait la notation rigoureuse, mais on se demande bien pourquoi la notation rigoureuse n'est pas accepté dans les chaînes ?
    C'est comme si en français l'expression « cela dit » devenait une faute de français sous prétexte que « ceci dit » est largement toléré bien qu'erroné.

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    C'est comme si en français l'expression « cela dit » devenait une faute de français sous prétexte que « ceci dit » est largement toléré bien qu'erroné.
    Dans une langue, il n'y a qu'une chose de vraie, c'est l'usage qu'en font les locuteurs.
    A l'inverse dans une langue informatique, c'est le concepteur qui donne les règles et on ne peut pas en déroger.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Membre confirmé Avatar de Gaulouis
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 252
    Points : 476
    Points
    476
    Par défaut Pour te finir
    Citation Envoyé par sabotage Voir le message
    oui mais cela n'explique pas pourquoi on ne peut pas écrire
    Nom : chicdesromains.jpg
Affichages : 201
Taille : 41,7 Ko

    Par ce que si tu autorise ça, alors pourquoi pas "$foo["y"]". Et la ça deviens ambiguë.

    Le parseur s'attend a un T_STRING ou à un T_VARIABLE et T_NUM_STRING mais pas à un T_CONSTANT_ENCAPSED_STRING.

    Mais, bonne nouvelle, rien ne t’empêche d'ajouter l'alternative T_CONSTANT_ENCAPSED_STRING à la grammaire PHP. Ca va ralentir un peu l’analyseur mais tu pourra faire des copier collé (enfin a moitié, par ce que pas quand il y a des double-quote).

    Du coup ca entraîne la question :
    Pourquoi est-ce que là le parser proteste ?
    Là le développeur que tu es se dit je vais ajouter un T_PAAMAYIM_NEKUDOTAYIM et doucement l'analyseur va commencer a tourner en boucle récursivement. Les développeurs autour de toi ne vont plus comprendre le code PHP de complexité 10 que tu va écrit et une licorne va mourir

    Nom : 1_sb3on.jpg
Affichages : 610
Taille : 279,4 Ko

  10. #10
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Je n'ai vraiment pas l'impression d'avoir été giflé par Obelix suite à ta démonstration.

    Par ce que si tu autorise ça, alors pourquoi pas "$foo["y"]". Et la ça deviens ambiguë.
    Parce ca ne suit pas la logique d'imbrication d'un texte ni en langage naturelle ni en langage informatique.
    De plus permettre quelque chose de simple n'implique pas d'autoriser ni autre chose de simple ni autre chose de compliqué.
    Par exemple on ne peut pas écrire "il dit : "bonjour"" mais on peut écrire "il dit : 'bonjour'"

    "$foo['y'.$baz]"
    La c'est bien expliqué dans la documentation, quand on veut des écritures complexes, le parser a des limites, on utilise {}
    Mais le sujet de base c'était de se demander pourquoi une écriture a priori plus simple à comprendre pour le parser (la clef est encadré) et identique à l'écriture en dehors d'une chaine, n'est pas prise en compte.

    Enfin moi personnellement ça ne m'empêche pas de dormir ni d'écrire du code.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  11. #11
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2009
    Messages
    256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : Février 2009
    Messages : 256
    Points : 79
    Points
    79
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Dans une langue, il n'y a qu'une chose de vraie, c'est l'usage qu'en font les locuteurs.
    Non, ça c'est l'excuse que se donnent ceux qui parlent mal ;-)
    Je regrette, mais les fautes de français ça existe.
    Je suis d'accord que l'usage fini par inventer de nouvelles tournures, mais jamais les anciennes ne deviennent des fautes.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Extraction de variables dans une chaîne
    Par Spack dans le forum Général Python
    Réponses: 6
    Dernier message: 20/05/2006, 19h42
  2. Peut-on inclure une variable dans une chaîne SQL ?
    Par beegees dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/03/2006, 11h31
  3. [SGBD] mysql_close() : Utile sans variable dans les () ?
    Par psychoBob dans le forum Requêtes
    Réponses: 4
    Dernier message: 05/01/2006, 21h08
  4. [EasyPHP] problème de visibilité des variable dans les includes
    Par d1g-2-d1g dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 23/10/2005, 01h55
  5. [VB.NET] [Débutant] Probléme de variable dans les requettes
    Par Silvia12 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 07/03/2005, 13h13

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