Je continue de lire que c'est une mauvaise pratique d'utiliser la balise de fermeture PHP ?>
à la fin du fichier. Le problème d'en-tête ne semble pas pertinent dans le contexte suivant (et c'est le seul bon argument jusqu'à présent):
Les versions modernes de PHP définissent l'indicateur output_buffering dans php.ini Si la mise en mémoire tampon de sortie est activée, vous pouvez définir des en-têtes HTTP et des cookies après la sortie de HTML car le code renvoyé n'est pas envoyé immédiatement au navigateur.
Chaque livre de bonnes pratiques et wiki commence par cette «règle» mais personne n'offre de bonnes raisons. Y a-t-il une autre bonne raison de sauter la balise PHP de fin?
php
security
http-headers
danidacar
la source
la source
?>
est paresseux?Réponses:
L'envoi d'en-têtes plus tôt que le cours normal peut avoir des conséquences d'une portée considérable. En voici quelques-unes qui me sont venues à l'esprit en ce moment:
Alors que les versions PHP actuelles peuvent avoir une mise en mémoire tampon de sortie, les serveurs de production réels sur lesquels vous déploierez votre code sont beaucoup plus importants que toutes les machines de développement ou de test. Et ils n'ont pas toujours tendance à suivre immédiatement les dernières tendances PHP.
Vous pouvez avoir des maux de tête à cause d'une perte de fonctionnalité inexplicable . Dites, vous implémentez une sorte de passerelle de paiement et redirigez l'utilisateur vers une URL spécifique après confirmation réussie par le processeur de paiement. Si une sorte d'erreur PHP, même un avertissement, ou une fin de ligne excessive se produit, le paiement peut rester non traité et l'utilisateur peut toujours sembler non facturé. C'est également l'une des raisons pour lesquelles la redirection inutile est mauvaise et si la redirection doit être utilisée, elle doit être utilisée avec prudence.
Vous pouvez obtenir des erreurs de type «Chargement de page annulé» dans Internet Explorer, même dans les versions les plus récentes. En effet, une réponse AJAX / json include contient quelque chose qu'elle ne devrait pas contenir, en raison des terminaisons de ligne excessives dans certains fichiers PHP, comme je l'ai rencontré il y a quelques jours.
Si vous avez des téléchargements de fichiers dans votre application, ils peuvent également se casser. Et vous ne le remarquerez peut-être pas, même après des années, car l'habitude de rupture spécifique d'un téléchargement dépend du serveur, du navigateur, du type et du contenu du fichier (et peut-être d'autres facteurs avec lesquels je ne veux pas vous ennuyer) .
Enfin, de nombreux frameworks PHP, y compris Symfony , Zend et Laravel (il n'y a aucune mention de cela dans les directives de codage mais il suit le mouvement) et la norme PSR-2 (point 2.2) nécessitent l'omission de la balise de fermeture. Le manuel PHP lui-même ( 1 , 2 ), Wordpress , Drupal et de nombreux autres logiciels PHP, je suppose, conseille de le faire. Si vous prenez simplement l'habitude de suivre la norme (et de configurer PHP-CS-Fixer pour votre code), vous pouvez oublier le problème. Sinon, vous devrez toujours garder le problème à l'esprit.
Bonus: quelques accrochages (en fait actuellement un) liés à ces 2 personnages:
?>
. Un exemple est Smarty, même les versions les plus récentes des branches 2. * et 3. * l'ont. Donc, comme toujours, surveillez le code tiers . Bonus en bonus: Une expression régulière pour supprimer les terminaisons PHP inutiles: remplacez(\s*\?>\s*)$
par du texte vide dans tous les fichiers contenant du code PHP.la source
\?>(?s:.){0,10}\Z
Explication succincte: changeset.hr/blog/miscellaneous/catch-near-eof-with-regex?>
: par exemple, il correspond à -et serait supprimé-?> Hello
dans<?php echo "test"; ?> Hello
. Nous souhaitons effacer uniquement les balises de fermeture.[core:notice] [pid 7842] AH00052: child pid 10218 exit signal Segmentation fault (11)
.?>
, qui (comme toute sortie) entraînent l'envoi des en-têtes dès leur sortie. Il n'y a pas d '"en-têtes HTML" (autres que la<header>
balise HTML5 indépendante ).La raison pour laquelle vous devez laisser la balise de fermeture php (
?>
) est pour que le programmeur n'envoie pas accidentellement des caractères de nouvelle ligne supplémentaires.La raison pour laquelle vous ne devriez pas laisser de côté la balise de fermeture php est parce qu'elle provoque un déséquilibre dans les balises php et que tout programmeur ayant la moitié de l'esprit peut se rappeler de ne pas ajouter d'espace blanc supplémentaire.
Donc pour votre question:
Non, il n'y a pas d' autre bonne raison d'ignorer les balises PHP finales.
Je terminerai avec quelques arguments pour ne pas s'embêter avec la balise de fermeture:
Les gens sont toujours capables de faire des erreurs, peu importe leur intelligence. Adhérer à une pratique qui réduit le nombre d'erreurs possibles est (à mon humble avis) une bonne idée.
PHP n'est pas XML. PHP n'a pas besoin d'adhérer aux normes strictes de XML pour être bien écrit et fonctionnel. Si une balise de fermeture manquante vous ennuie, vous êtes autorisé à utiliser une balise de fermeture, ce n'est pas une règle définie dans un sens ou dans l'autre.
la source
C'est un recommandation de style de codage pour débutant , bien intentionnée et conseillée par le manuel .
L'évitement
?>
résout cependant juste un filet des en- têtes communs déjà envoyés (sortie brute, nomenclature , notifications, etc.) et leurs problèmes de suivi.PHP contient en fait de la magie pour manger des sauts de ligne uniques après la
?>
jeton de fermeture. Bien que cela ait des problèmes historiques , et laisse les nouveaux arrivants toujours sensibles aux éditeurs floconneux et se déplaçant involontairement dans d'autres espaces blancs après?>
.Sur le plan stylistique, certains développeurs préfèrent afficher
<?php
et en?>
tant que balises SGML / instructions de traitement XML, ce qui implique la cohérence de l'équilibre d'un jeton de fermeture. (Ce qui, entre autres, est utile pour la classe de conjonction de dépendances inclut pour supplanter le chargement automatique inefficace fichier par fichier.)Un peu inhabituellement, l'ouverture
<?php
est caractérisée comme un shebang PHP (et entièrement réalisable par binfmt_misc ), validant ainsi la redondance d'une balise close correspondante.Il y a une différence évidente entre advise guides de syntaxe PHP classique rendant obligatoire
?>\n
et plus les récents (PSR-2) s'entendent sur une omission.(Pour mémoire: Zend Framework postulant l'un sur l'autre n'implique pas sa supériorité inhérente. C'est une idée fausse que les experts ont été attirés vers / cibler le public des API encombrantes).
SCM et IDE modernes fournissent des solutions intégrées qui atténuent principalement le gardiennage d'étiquettes rapprochées.
Décourager toute utilisation du
?>
balise close retarde simplement l'explication du comportement de base du traitement PHP et de la sémantique du langage pour éviter les problèmes peu fréquents. Il est toujours pratique pour le développement de logiciels collaboratifs en raison des variations de compétences des participants.Fermer les variations de balise
La balise de fermeture régulière ?> est également appelée
T_CLOSE_TAG
"jeton de fermeture".Il comprend quelques incarnations de plus, en raison de la nouvelle ligne magique des PHP :
?>\n (Saut de ligne Unix)
?>\r (Retour chariot, MAC classiques)
?>\r\n (CR / LF, sur DOS / Win)
NELCependant, PHP ne prend pas en charge le saut de ligne combiné Unicode (U + 0085).
Les premières versions de PHP avaient des compilations IIRC limitant quelque peu l'agnosticisme de la plate-forme (FI même juste utilisé
>
comme marqueur de fermeture), qui est l'origine historique probable de l'évitement des balises de fermeture.Souvent négligé, mais jusqu'à ce que PHP7 les supprime , le régulier
<?php
jeton d'ouverture peut être valablement jumelé avec le rarement utilisé</script>
comme jeton de fermeture impair .Le " hard close tag " n'en est même pas un - vient de faire ce terme pour l'analogie. En termes de conception et d'utilisation, il
__halt_compiler
convient toutefois de reconnaître qu'il s'agit d'un signe symbolique proche.Ce qui oblige fondamentalement le tokenizer à éliminer tout code ou sections HTML simples par la suite. En particulier, les talons PHAR utilisent cela, ou sa combinaison redondante avec
?>
comme illustré.De même, un vide se
return;
substitue rarement aux scripts d'inclusion, ce qui rend tout?>
espace avec des espaces de fin non efficace.Ensuite, il existe toutes sortes de variations de balises de fermeture douce / fausse ; moins connus et rarement utilisés, mais généralement par jetons commentés :
// ? >
Espacement simple pour échapper à la détection par le tokenizer PHP.Ou des substituts Unicode fantaisistes
// ﹖﹥
(U + FE56 PETIT QUESTION MARK, U + FE65 SMALL ANGLE BRACKET) qu'une expression rationnelle peut comprendre.Les deux ne signifient rien pour PHP , mais peuvent avoir des utilisations pratiques pour les kits d'outils externes PHP ou semi-conscients.
cat
Les scripts joints à nouveau viennent à l'esprit, avec des// ? > <?php
concaténations résultantes qui conservent en ligne l'ancien sectionnement de fichiers.Il existe donc des alternatives contextuelles mais pratiques à une omission impérative de balise de fermeture.
Le babysitting manuel d'
?>
étiquettes proches n'est pas très contemporain de toute façon. Il y a toujours eu des outils d'automatisation pour cela (même si ce n'est que sed / awk ou regex-oneliners). En particulier:Ce qui pourrait généralement être utilisé pour
--unclose
php des balises pour du code tiers, ou plutôt pour corriger tout (et tous) les problèmes d'espace / de nomenclature réels:phptags --warn --whitespace *.php
Il gère également la
--long
conversion de balises, etc. pour la compatibilité d'exécution / configuration.la source
<?php if($var): ?>Hello World<?php endif; ?>
??? Je suis vraiment curieux car ce n'est pas spécifiquement mentionné.Ce n'est pas un tag…
Mais si vous l'avez, vous risquez d'avoir un espace blanc après.
Si vous l'utilisez ensuite comme inclusion en haut d'un document, vous pourriez finir par insérer un espace blanc (c'est-à-dire du contenu) avant d'essayer d'envoyer des en-têtes HTTP… ce qui n'est pas autorisé.
la source
<?php $i = 1; ?>
puis file2.php:<?php include 'file1.php'; header('Location: http://www.google.com');?>
phpcs
pour m'assurer que la balise de fermeture est laissée de chacun de mes fichiers et ensuite je ne m'inquiète pas de la mise en mémoire tampon de sortie :)C'est assez utile de ne pas laisser la fermeture
?>
.Le fichier reste valide pour PHP (pas une erreur de syntaxe) et comme @David Dorward l'a dit, il permet d'éviter d'avoir des espaces / lignes de rupture (tout ce qui peut envoyer un en-tête au navigateur) après la
?>
.Par exemple,
ne sera pas valide.
Mais
volonté.
Pour une fois, il faut être paresseux pour être en sécurité .
la source
?>
. sécurisé n'est peut-être pas le bon mot ici. Quoi qu'il en soit, cela ne règle rien (ce n'est pas un mauvais code pour empêcher les choses, unecho
ici aurait été un mauvais code) mais / et il est toujours valide. Prouvez-moi mal à ce sujet.?>
à la fin d'un fichier php uniquement. mais avez-vous déjà eu besoin de déboguer une erreur causée par des espaces de fin? De plus, tous les serveurs ne sont pas configurés de la même manière, en particulier lorsque vous vous déplacez vers un autre hôte, intercepter les erreurs prend beaucoup de temps. Si vous voulez?>
simplement le faire, si vous ajoutez également un espace de fin et que votre équipe doit déboguer pour être prêt à blâmer sur git ^^Selon les documents , il est préférable d'omettre la balise de fermeture si elle se trouve à la fin du fichier pour la raison suivante:
Manuel PHP> Référence du langage> Syntaxe de base> Balises PHP
la source
Eh bien, je connais la raison, mais je ne peux pas la montrer:
Source: http://framework.zend.com/manual/en/coding-standard.php-file-formatting.html
la source
Eh bien, il y a deux façons de voir les choses.
.php
extension n'est rien de plus qu'un fichier XML qui se trouve être analysé pour le code PHP..php
extensions PEUVENT être des fichiers XML valides, mais ils n'ont pas besoin de l'être.Si vous croyez à la première route, tous les fichiers PHP nécessitent la fermeture des balises de fin. Les omettre créera un fichier XML non valide. Là encore, sans avoir une
<?xml version="1.0" charset="latin-1" ?>
déclaration d' ouverture , vous n'aurez pas un fichier XML valide de toute façon ... Ce n'est donc pas un problème majeur ...Si vous croyez au deuxième itinéraire, cela ouvre la porte à deux types de
.php
fichiers:Sur cette base, les fichiers de code uniquement peuvent se terminer sans
?>
balise de fermeture . Mais les fichiers de code XML ne sont pas autorisés à se terminer sans fermeture?>
car cela invaliderait le XML.Mais je sais à quoi tu penses. Vous pensez à ce qui importe, vous n'allez jamais rendre un fichier PHP directement, alors peu importe si c'est du XML valide. Eh bien, cela importe si vous concevez un modèle. S'il s'agit d'un XML / HTML valide, un navigateur normal n'affichera tout simplement pas le code PHP (il est traité comme un commentaire). Vous pouvez donc simuler le modèle sans avoir à exécuter le code PHP dans ...
Je ne dis pas que c'est important. C'est juste un point de vue que je ne vois pas exprimé trop souvent, alors quel meilleur endroit pour le partager ...
Personnellement, je ne ferme pas les balises dans les fichiers de bibliothèque, mais dans les fichiers de modèle ... Je pense que c'est une préférence personnelle (et une directive de codage) basée plus que tout sur le dur ...
la source
En plus de tout ce qui a déjà été dit, je vais ajouter une autre raison qui a été très difficile à déboguer.
Apache 2.4.6 avec PHP 5.4 fait en fait des erreurs de segmentation sur nos machines de production quand il y a de l'espace vide derrière la
php
balise de fermeture . J'ai juste perdu des heures jusqu'à ce que je réduise enfin le bug avec strace .Voici l'erreur que Apache lance:
la source
"Y a-t-il une autre bonne raison (autre que le problème d'en-tête) pour ignorer la balise php de fin?"
Vous ne voulez pas sortir par inadvertance des caractères d'espaces blancs superflus lors de la génération d'une sortie binaire, de données CSV ou d'une autre sortie non HTML.
la source
Avantages
Les inconvénients
Conclusion
Je dirais que les arguments en faveur de l'omission de la balise semblent plus forts (aide à éviter les gros maux de tête avec header () + c'est la "recommandation" PHP / Zend). J'avoue que ce n'est pas la plus "belle" solution que j'ai jamais vue en termes de cohérence syntaxique, mais quoi de mieux?
la source
Comme ma question a été marquée comme doublon de celle-ci, je pense que c'est OK de poster pourquoi NE PAS omettre la balise de fermeture
?>
peut être souhaité pour certaines raisons.<?php ... ?>
), la source PHP est un document SGML valide, qui peut être analysé et traité sans problème avec l'analyseur SGML. Avec des restrictions supplémentaires, il peut également s'agir de XML / XHTML valide.Rien ne vous empêche d'écrire du code XML / HTML / SGML valide. La documentation PHP en est consciente. Extrait:
Bien sûr, la syntaxe PHP n'est pas stricte SGML / XML / HTML et vous créez un document, qui n'est pas SGML / XML / HTML, tout comme vous pouvez transformer HTML en XHTML pour être compatible XML ou non.
À un moment donné, vous souhaiterez peut-être concaténer des sources. Ce ne sera pas aussi simple que de le faire simplement
cat source1.php source2.php
si vous avez introduit une incohérence en omettant les?>
balises de fermeture .Sans
?>
cela, il est plus difficile de dire si le document a été laissé en mode d'échappement PHP ou PHP ignore (la balise PI<?php
peut avoir été ouverte ou non). La vie est plus facile si vous laissez systématiquement vos documents en mode ignorer PHP. C'est comme travailler avec des documents HTML bien formatés par rapport aux documents avec des balises non fermées, mal imbriquées, etc.Il semble que certains éditeurs comme Dreamweaver peuvent avoir des problèmes avec PI laissé ouvert [1] .
la source
Si je comprends bien la question, cela a à voir avec la mise en mémoire tampon de sortie et l'effet que cela pourrait avoir sur les balises de fermeture / fin. Je ne suis pas sûr que ce soit une question tout à fait valable. Le problème est que le tampon de sortie ne signifie pas que tout le contenu est conservé en mémoire avant de l'envoyer au client. Cela signifie qu'une partie du contenu l'est.
Le programmeur peut vider délibérément le tampon ou le tampon de sortie. L'option de tampon de sortie en PHP change-t-elle vraiment la façon dont la balise de fermeture affecte le codage? Je dirais que non.
Et c'est peut-être pour cela que la plupart des réponses sont revenues à un style et à une syntaxe personnels.
la source
Il y a 2 utilisations possibles du code php:
dans le cas 1. la balise de fermeture est totalement inutile, aussi je voudrais voir juste 1 (une) balise ouverte php et NO (zéro) balise de fermeture dans un tel cas. C'est une bonne pratique car elle rend le code propre et sépare la logique de la présentation. Pour le cas de présentation (2.), certains ont trouvé qu'il était naturel de fermer toutes les balises (même celles traitées par PHP), ce qui conduit à une confusion, car le PHP a en fait 2 cas d'utilisation distincts, qui ne devraient pas être mélangés: logique / calcul et présentation
la source