Est-ce une mauvaise pratique d’utiliser la balise <? = En PHP?

190

Je suis tombé sur cette balise PHP <?= ?>récemment et je suis réticent à l'utiliser, mais ça me démange tellement que je voulais avoir votre avis. Je sais que c'est une mauvaise pratique d'utiliser des balises courtes <? ?>et que nous devrions utiliser des balises complètes à la <?php ?>place, mais qu'en est-il celui-ci <?= ?>:?

Cela économiserait un peu de frappe et ce serait mieux pour la lisibilité du code, IMO. Donc au lieu de cela:

<input name="someVar" value="<?php echo $someVar; ?>">

Je pourrais l'écrire comme ça, ce qui est plus propre:

<input name="someVar" value="<?= $someVar ?>">

L'utilisation de cet opérateur est-elle mal vue?

marco-fiset
la source
11
Le problème avec ce genre de question est qu’il est tellement avisé. Il n'y a "techniquement" pas de bonne ou de mauvaise façon. Certains plaident pour, d'autres contre, c'est sa préférence. En fin de compte, c'est à vous de décider.
mseancole
Évitez la balise de fermeture sous quelque forme que ce soit, si vous le pouvez - c'est-à-dire que le fichier ne contient que du code php (pas de code html, etc.). Si vous avez une balise de fermeture, tous les caractères qui suivront seront transmis au navigateur (pour une application Web), ce qui peut rendre très difficile le débogage des problèmes. Pour en savoir plus: stackoverflow.com/a/4453835/49560
dharm0us
Non lié à l'opinion: faites attention, car cela echomène très facilement à XSS, et vous devriez vous fier à une méthode d'écho personnalisée (c.-à-d. Avoir un function html($x) { echo htmlentities($x,...); }et un html($someVar);au lieu de echo $someVarou utiliser echo json_encode($x);pour un contexte JS). Cela rend alors les <?=balises une mauvaise pratique car cela signifie que le contenu de la variable a été échappé par HTML et que cet endroit doit savoir comme par magie que cette variable doit être échappée au format HTML car elle est répercutée dans le contexte HTML.
Xenos

Réponses:

211

Histoire

Avant que le train de fausses informations ne parte trop loin de la gare, vous devez comprendre beaucoup de choses sur les balises courtes PHP.

Le principal problème des balises courtes de PHP est que PHP a réussi à choisir une balise ( <?) utilisée par une autre syntaxe, XML .

Avec l'option activée, vous ne pouviez pas générer la déclaration XML sans générer d'erreur de syntaxe:

<?xml version="1.0" encoding="UTF-8" ?>

Ceci est un gros problème lorsque vous considérez à quel point l'analyse et la gestion XML sont courantes.

Qu'en est- il <?=?

Bien que <?provoque des conflits avec XML, <?= ne le fait pas . Malheureusement, les options d'activation et de désactivation de l'option étaient liées short_open_tag, ce qui signifiait que pour tirer avantage de la balise echo courte ( <?=), il fallait gérer les problèmes posés par la balise ouverte courte ( <?). Les problèmes associés à la balise ouverte courte étaient bien plus importants que les avantages de la balise écho courte. Vous trouverez donc un million et demi de recommandations à short_open_tagdésactiver, ce que vous devriez .

Avec PHP 5.4, toutefois, la balise echo courte a été réactivée séparément de l' short_open_tagoption. Je vois cela comme une approbation directe de la commodité de <?=, étant donné que rien en lui-même n'est faux.

Le problème est que vous ne pouvez pas en garantir le résultat <?=si vous essayez d'écrire du code pouvant fonctionner dans un plus grand nombre de versions de PHP.

ok, alors maintenant que tout cela est hors du chemin

Devriez-vous utiliser <?=?

Organigramme indiquant s'il faut ou non utiliser la balise echo courte

zzzzBov
la source
71
Je ne suis pas d'accord avec votre diagramme accrocheur. La réponse correcte est OUI à 99,99%, car la plupart des environnements de production sont configurés pour utiliser des balises courtes. En supposant que vous supprimiez et que vous supprimiez <?=à l'avenir, vous pouvez le réparer en moins d'une minute, peu importe le nombre de milliers de fichiers utilisés, il vous suffit d'effectuer une recherche et un remplacement de l'ensemble <?=du projet <?php echo . Ma réponse est que vous n'avez pas à vous inquiéter et que vous l'utilisez , les avantages l'emportent largement sur les conséquences. <?=n’est plus considéré comme un mot-clé, Rasmus Lerdorf lui-même s’y est engagé.
dukeofgaming
32
@dukeofgaming, où obtenez-vous vos données sur les environnements de production configurés pour utiliser des balises courtes? Leur désactivation est l’une des configurations les plus couramment suggérées dont j’ai entendu parler, après la désactivation des guillemets magiques. En outre, il serait absolument dénué de sens de créer un environnement de développement différent de celui de la production.
zzzzBov
4
Les balises courtes ont été activées par défaut jusqu’à la version 5.3 php.net/manual/fr/ini.core.php#ini.short-open-tag , la plupart des services d’hébergement que je connais le supportaient sans problème et c’est une des raisons pour lesquelles le cadre Kohana utilisé pour l'encourager. <?=sera toujours activé ( stackoverflow.com/a/6064813/156257 ) et la plupart du temps, ils étaient allumés. Vous pouvez prouver que je me trompe en vérifiant auprès de votre hôte si: ils sont désactivés et utilisent PHP <5.3 et s'ils n'autorisent pas le paramètre à être écrasé par les utilisateurs ou sur demande spéciale; si tout ce qui précède est faux, ne vous inquiétez pas <?=.
dukeofgaming
6
Vous n'êtes pas inquiet que <?=cela soit supprimé, et moi non plus. D'autres pourraient l'être, et s'ils le sont, ils ne doivent pas en utiliser <?=. Certaines personnes ont une peur irrationnelle d'utiliser certaines fonctionnalités du langage ( comme de ne pas fermer les balises de fermeture dans php ).
zzzzBov
8
C'est précisément ce que je veux dire: il n'y a pas de quoi s'inquiéter . Je viens de mettre "Êtes-vous inquiet?" --oui -> "Allez-y et utilisez-les, vous n'avez pas à vous inquiéter". Vous avez également l’impression que laisser tomber les balises fermantes est une mauvaise pratique, ce qui n’est pas le cas.
dukeofgaming
29

Dépoussiérer mon chapeau PHP

Je préférerais définitivement utiliser <?= $someVar ?>le plus verbeux echo(préférence personnelle). Le seul bémol AFAIK concerne les utilisateurs de versions antérieures à 5.4.0, auquel cas ils short_open_tagdoivent être activés dans le fichier php.ini .

Cela dit, si votre projet n’est pas un système d’exploitation, alors il s’agit d’un point discutable. Si c'est le cas, je documenterais le fait que short_open_tags doit être activé ou utiliser la plus portable des deux solutions.

Demian Brecht
la source
1
Nitpick: Même s’il <?=n’est pas affecté par short_open_tagPHP 5.4, <?il l’est toujours et si vous prenez l’habitude d’utiliser des balises de formulaire courtes, il est assez facile d’oublier ce qui est supporté par quelle version.
Yannis
7
@YannisRizos Il est bon de faire la distinction entre <?="Je produis une variable maintenant" pour une utilisation de type modèle et <?php"J'utilise beaucoup de code maintenant". Je suggère de ne jamais utiliser <?, mais que les deux <?=et <?phpvont bien.
Izkata
2
+1 parce que Rasmus Lerdorf approuve le raccourci <? = Tag. J'ai regardé une de ses discussions sur le PHP 5.4 (qui devait bientôt être publié). C’est pourquoi, depuis PHP 5.4.0, la balise <? = Est toujours disponible. J'ai vu beaucoup de code avant PHP 5.4 que la balise <? = Était utilisée dans la vue d'une application MVC mais que <? Php ...?> Était utilisé dans les fichiers sans vue.
programmeur
@ Jason Ce n'est pas ce que je dis. "Rasmus approuve foo" n'est pas un argument, "Rasmus approuve foo pour ceci et cette raison" l'est cependant.
Yannis
2
@Yannis Rizos "Rasmus approuve foo pour ceci et cette raison" l'est cependant. Merci pour la tutelle, mais mon raisonnement était puisque Rasmus Lerdorf l'a approuvé, étant le créateur du langage et ayant toujours une influence sur le développement de PHP, des modifications ont été apportées pour que le tag <? = Soit toujours disponible. C'est ce que j'aurais dû ajouter à mon commentaire initial "Par conséquent, la pratique consistant à utiliser <? = Dans les vues deviendra probablement encore plus répandue." Dang, je vais devoir vérifier trois fois mes commentaires pour le moment ... points ...
programmeur
21

Vous devez absolument essayer d'éviter les balises de forme abrégée, que ce soit <?ou <?=.

La raison technique principale est la portabilité, vous ne pouvez jamais être sûr que les balises de forme courte fonctionneront pour chaque configuration donnée, car elles peuvent être désactivées, consultez la short_open_tagdirective. Mais vous pouvez toujours être absolument certain que le formulaire long fonctionnera partout.

Cela économiserait un peu de frappe et ce serait mieux pour la lisibilité du code, IMO.

C'est aussi une mauvaise habitude. Je ne peux pas vraiment vous dire ce que vous trouvez plus lisible, mais je suis fébrile contre l'utilisation de la lisibilité du code comme excuse pour vous épargner quelques frappes de touche. Si vous êtes préoccupé par la lisibilité, vous devriez vous tourner vers un moteur de template, ceci:

<input name="someVar" value="{someVar}">

est beaucoup plus lisible à partir de vos deux exemples.

Enfin, il convient de noter que les balises de forme abrégée sont explicitement découragées par les grands projets PHP, tels que PEAR et Zend Framework .

Yannis
la source
14
+1 pour les modèles. -1 pour la portabilité. C'est une langue côté serveur. Les défis sur lesquels vous devez vous concentrer pour un serveur sont l’évolutivité et la sécurité. Ce serait une très mauvaise idée d'investir sérieusement du temps pour s'assurer qu'il fonctionne sur plusieurs plates-formes ... (juste au cas où!) ...
riwalk
3
@ Stargazer712 Hm? La seule chose que vous devez faire est d' utiliser la norme <?phpet au echolieu de <?et <?=, comptez-vous que le temps sérieux? Et que se passe-t-il lorsque vous déplacez votre projet sur un serveur où, pour une raison quelconque, les balises courtes sont désactivées?
Yannis
13
@Yannis: ces quelques personnages peuvent sembler minimes, mais à leur connaissance, ils génèrent beaucoup de bruit.
Kevin Cline
8
Je pense qu'il convient de mentionner que le but initial de PHP était d'être un langage de template . Ajouter un autre moteur de template (plus lourd) au-dessus de PHP ne fait pas flotter mon thonier. Il suffit de suivre les bonnes pratiques (voici quelques bonnes astuces: stackoverflow.com/questions/62617/… ) lorsque vous codez PHP en même temps que HTML et vous êtes prêt à partir.
programmeur
2
@ Yannis Rizos Oui, il convient de le mentionner car les débutants en PHP pourraient penser qu'ils sont obligés d'utiliser le moteur de template [whizbang] dans leurs projets PHP sans envisager d'utiliser du PHP pur à la place. Devrais-je ne faire que du traitement de texte en Perl , peut-être pas, mais je pense maintenant que Perl est vachement doué pour le traitement de texte - de même avec PHP et les modèles.
programmeur
15

La documentation PHP dit clairement que vous pouvez utiliser des balises echo courtes en toute sécurité:

5.4.0 The tag <?= is always available regardless of the short_open_tag ini setting.

Bien que ce soit pour PHP version 5.4 ou supérieure, mais tout le monde devrait au moins utiliser celle-ci. Je les préférerais uniquement à des fins de modèles.

Hexodus
la source
10

Raisons pour utiliser des balises courtes:

  • Ils sont plus courts.

Raisons pour ne pas utiliser de balises courtes:

  • Ils introduisent une configuration de plus: si vous contrôlez le serveur la plupart du temps dans un contexte professionnel, si vous envisagez de divulguer votre code au grand public, des balises courtes risquent de ne pas fonctionner correctement pour ceux qui l'utilisent sur un hébergement partagé, par exemple. .
  • Ils facilitent trop facilement l’insertion de chaînes non assainies dans votre sortie. Cela fait peur, car cela pourrait introduire des vulnérabilités XSS. Bien que les longues balises ne fassent rien directement pour empêcher cela, elles indiquent au programmeur que ce qu’elles font n’est peut-être pas la bonne chose à faire et qu’elles devraient commencer à utiliser un système de modèles qui gère automatiquement le codage HTML pour elles maintenant . Produire des chaînes dynamiques avec de longues balises est douloureux, ce qui est une bonne chose (éducative).
tdammers
la source
C'est la solution pour accepter IMO, même si les modèles ne rendent pas tout XSS sûr (les données utilisateur dans l'attribut src d'un script seront toujours dangereuses) et je ne sais pas si les mécanismes de modèle sont conscients du contexte d'écho approprié; Et si la variable PHP finissait dans le contenu d'une balise script? Dans un fichier SVG intégré au HTML?
Xenos
@Xenos clairement cela dépend du système de gabarit en question, et il n'y a pas de solution miracle; mais la plupart d'entre eux réduisent la surface des bogues et le nombre de scénarios dans lesquels la diligence manuelle (la source la plus importante de bogues de sécurité) est requise. "Ne mettez pas de contenu dynamique dans les balises de script" est plus simple à suivre (et à auditer) que "assurez-vous que tout le contenu dynamique est correctement codé en HTML partout".
tdammers
4

Je pense que la <?=version est une pratique acceptable / acceptable, à condition que vous ne l'utilisiez que pour la sortie finale des variables et évitez tout appel de fonction ou logique ternaire qui n'est pas directement lié à la présentation des données.

C'est certainement beaucoup mieux que <? echo($x); ?>partout.

À long terme, vous voudrez peut-être vous pencher sur des moteurs de modélisation tels que Smarty .

Darien
la source
3
Smarty était autrefois le moteur de gabarit, mais pour l’instant, c’est un gâchis obsolète et suranné, et vous devriez vraiment vous y tenir.
Yannis
2

Depuis PHP 7.4, le terrain de jeu change un peu:

<? ?> est officiellement obsolète et sera supprimé de PHP 8.0.

PHP RFC: Deprecate PHP Les balises ouvertes courtes indiquent explicitement que cela <?= ?>n'est pas affecté. Cela indiquerait (selon moi, pas le RFC) que son utilisation n'est pas découragée.

Etienne Bruines
la source
-3

Pour être honnête, je pense que faire écho à un résultat quelle que soit la méthode utilisée (ancienne ou nouvelle mode) est quelque chose d'assez obsolète alors que MVC célèbre déjà 33 ans.

Je dirais que oui, il est recommandé d’encapsuler les données du serveur entrant (php) dans un document XML et de les traiter dans votre couche applicative / client, vous évitant ainsi l’idée même de l’utilisation d’une telle balise.

sebas
la source
1
En réalité, MVC fête ses 33 ans. Il a été présenté pour la première fois en décembre 1979 dans cet article .
Yannis
ouais, je suis toujours dans le 2000, mon erreur :-)
sebas
1
euh ... Templating ... est-il obsolète? Les modèles et MVC sont-ils mutuellement exclusifs?
Tim Seguine