Quel est le meilleur: inclure du HTML dans du code PHP ou en dehors?

28

Regarde ça:

<?php
echo "Hello World";
?>
<br />
<?php
echo "Welcome";
?>

Et maintenant, regardez ceci:

<?php
echo "Hello World";
echo "<br />";
echo "Welcome";
?>

Lequel des exemples ci-dessus est considéré comme le meilleur (au moins du point de vue des performances)?.

Je sais que les exemples sont triviaux mais je veux suivre les bonnes pratiques dès le début, donc quand j'ai de plus en plus de lignes, cela n'affectera pas la performance ou quoi que ce soit de manière négative.

rashed
la source
14
Cela ne semble pas être massivement populaire en PHP, mais notez que dans d'autres écosystèmes, les deux sont considérés comme mauvais et l'alternative appropriée est de créer un modèle de toutes les parties statiques avec une logique minimale pour inclure des parties dynamiques, puis de le rendre à partir de la langage de programmation.
1
@delnan - Vous devriez envisager de publier cela comme une réponse, sous une forme légèrement développée. C'est beaucoup plus propre.
jmort253
@ jmort253 J'ai réfléchi, mais je n'ai que très peu de connaissances en PHP, donc je ne pouvais pas parler des meilleures pratiques dans le monde PHP.
Quel problème essayez-vous de résoudre?
Jim G.
En termes de performances, cela n'a pas d'importance. Le réseau est tellement plus lent en comparaison. Le coût de transfert est considérablement plus élevé, ce qui rend le coût de production insignifiant en comparaison.
Martin York

Réponses:

23

Comme le souligne le commentaire, cela devrait être fait par des modèles. Mais si seulement vos deux choix sont possibles. Le cas 1 sera meilleur. Il s'agit du même concept que la mise en page de gonflage Android par xml, ou la création par programme de l'interface utilisateur. Votre <br/>est un contenu statique de votre html et tout ce que votre serveur fera sera de le montrer. Mais si vous utilisez php, pour l'exécuter, cela utilisera les ressources de vos serveurs et sera informatique.

Voici comment procéder: index.php:

<?php
include 'header.html';
...
include 'footer.html';  
?>  

header.html et footer.html sont des modèles.

wtsang02
la source
1
J'ai lu un livre pour Kevin Yank qui est "Novice PHP et MySQL à Ninja" sur quelque chose appelé Contrôleurs et modèles. S'agit-il de la même chose dont vous me parliez ou sont-ils différents? s'ils sont les mêmes, comment le fait de mettre le code dans des fichiers différents le rendra-t-il plus performant?
précipité
Les modèles rendent votre site Web ou votre application plus flexible. Voyez-vous comment les en-têtes et pieds de page ou même les postes de StackOverflow sont les mêmes? Ils utilisent le même modèle et le remplissent de données dynamiques.
wtsang02
Quelle est la principale raison derrière cela? Et si nous ne le faisons pas de cette façon? que perdrons-nous?
éruption
Regardons cela. Ceci est le 4ème commentaire de ce message de réponse. Si vous affichez cette page sur la source maintenant, vous verrez "<div> <span ...> ... </span> <a ...> ... </a>" Imagerie manuelle codant le 4000ème commentaire. Est-ce possible? ou faites-le simplement comme modèle et demandez à votre serveur de l'ajouter lorsque cela est nécessaire.
wtsang02
1
Aussi @wtsang, vous n'avez jamais que ces deux choix, vous en avez toujours un troisième, courez (ou apprenez.)
ocodo
54

Pour répondre directement à votre question: ne faites jamais écho à un texte statique ou HTML. Laissez cela en dehors de votre PHP.

<?php echo "<p>Hello World</p>"; // Alway wrong. ?>

<p>Hello World</p>  <!-- Does the same thing, faster, and is more readable. -->

S'échapper vers PHP est un gaspillage si tout ce que vous allez faire est de passer en texte statique ou en html statique. Tout le code à l'intérieur de <?php ?>est envoyé à PHP pour être interprété. Cela signifie que votre site Web est plus lent et que vous gaspillez de l'électricité si vous passez de grandes quantités de texte statique à PHP sans raison. (Parfois, il y a une raison.)

La meilleure pratique consiste à faire fonctionner votre logique et votre grognement dans des fichiers sans HTML, uniquement PHP.

La façon dont j'aime le faire est avec un framework MVC. J'ai du PHP pur dans les modèles et les contrôleurs, et un mélange de HTML et PHP dans les vues. Vous n'avez pas besoin d'un framework MVC; vous pouvez simplement coller votre mélange de HTML dans des fichiers modèles, que vous incluez ensuite dans vos fichiers PHP purs.

Une fois que vous avez créé vos variables (qui ne contiennent pas de code HTML) dans des fichiers PHP purs, vous pouvez les transmettre au fichier avec votre code HTML. Là, et seulement là, est-ce bien de mélanger HTML et PHP. Mais, et ceci est important, mais lorsque vous travaillez avec des fichiers HTML, gardez le PHP au minimum.

Heureusement, PHP est livré avec des outils conviviaux pour rendre PHP plus facile à lire lorsqu'il est mélangé avec du HTML.

Syntaxe alternative

La meilleure pratique consiste à utiliser la syntaxe PHP régulière lors de l'écriture de PHP pur, mais la syntaxe alternative, lors du mélange de PHP et HTML.

Dans les fichiers PHP standard sans HTML:

if ($something) {
  do_something(); // do_something() shouldn't echo or print.
}

C'est beau pour du PHP pur, mais pas idéal pour échapper au HTML. En particulier, les accolades de fermeture sont souvent difficiles à comprendre lorsqu'elles apparaissent dans de gros tas de HTML.

Il semble, sur la base de votre question, que vous auriez écrit, dans un fichier mélangeant HTML et PHP, ceci:

<?php
  if ($something) {
    echo '<p>Hello World.</p>';
  }
?>

Pour les raisons décrites ci-dessus, nous souhaitons que le HTML ne soit pas envoyé à PHP. Nous faisons cela comme ceci:

<?php if ($something) { ?>
  <p>Hello World.</p>
<?php } ?>

Nous avons retiré notre code HTML de nos balises PHP, ce qui est une amélioration. Mais on pourrait aller plus loin.

Remarquez à quel point l'accolade de fermeture n'est pas informative? Nous ne savons pas s'il ferme une boucle ou une instruction if. Cela semble trivial dans l'exemple ci-dessus, mais il y a souvent des dizaines de lignes de HTML à l'intérieur de if / endif à l'intérieur d'une boucle / endloop.

La meilleure pratique est que dans un fichier mélangeant PHP et HTML, vous utilisez la syntaxe alternative, qui omet les accolades ouvrantes et fermantes ( { }):

<?php if ($something): ?>
  <p>Hello world.</p>
<?php endif; ?>

Mis à part la sémantique de la nouvelle syntaxe ( :et endif;au lieu de {et }), vous devriez remarquer deux choses:

  1. Encore une fois, le HTML et le texte, bien que contrôlés par PHP, sont en dehors des <?php ?>balises, donc ils ne sont pas interprétés. Pour les raisons décrites ci-dessus, c'est bien.
  2. C'est beaucoup plus informatif que si tout cela était du php, y compris des accolades de fermeture aléatoires ( <?php } ?>) fermant des choses difficiles à trouver où elles se sont ouvertes (car elles sont mélangées avec une bouffée de HTML à l'aspect désordonné). Encore une fois, imaginez un gros fichier HTML avec des boucles et des instructions if. Spécifier ce que vous fermez peut clarifier beaucoup.

La même syntaxe conviviale pour les modèles peut également être utilisée pour les boucles:

<?php foreach ($things as $thing): ?>
  <li><?php echo $thing; ?></li>
<?php endforeach; ?>

Balises courtes

Un autre excellent outil fourni par PHP que, encore une fois, vous ne souhaitez utiliser lorsque vous mélangez PHP et HTML ensemble, est les balises courtes. Vous devrez peut-être activer les balises courtes dans le fichier php.ini. Une fois activées, les balises courtes rendent tout encore plus lisible.

Sans balises courtes, vous devez écrire <?php echo $something; ?>mais avec des balises courtes, vous pouvez écrire <?=$something?>et cela aura exactement le même résultat.

Lorsque vous combinez des balises courtes et la syntaxe PHP alternative, vous pouvez vraiment écrire des fichiers HTML élégants, qui incluent des éléments PHP. Prenant notre dernier exemple de boucle (juste la partie à l'intérieur de la boucle), les balises courtes nous permettent de réduire:

<li><?php echo $thing; ?></li>

à

<li><?=$thing?></li>

ce qui est beaucoup plus lisible.

Pouvons-nous aller plus loin? Oui. En utilisant divers systèmes de modèles, vous pouvez faire des choses comme:

<li>{thing}</li>

Ce qui est incroyablement lisible. Les systèmes de modèles, cependant, sont bien au-delà de la portée de la question initiale (que j'ai laissée il y a quelque temps de toute façon).

Ted
la source
4
+1 Pour être un bon conseil pour tout le monde. La syntaxe de contrôle alternative et les balises courtes sont extrêmement importantes pour démarrer avec les modèles et séparer la logique de la présentation.
Will Meldon
1
Les étiquettes courtes doivent être utilisées avec prudence. Si vous construisez du code qui sera réutilisé, vous ne pouvez pas garantir que la short_open_tagdirective sera toujours activée. PHP 5.4 rend <?=$thing?>disponible tout le temps, même lorsqu'il short_open_tagest désactivé. En outre, short_open_tagest désactivé par défaut pour éviter les conflits avec XML.
Chris
3
+1 pour afficher les différentes alternatives, progressant vers la meilleure réponse.
Tola Odejayi
1
Peut-être que c'était vrai, mais je viens de vérifier les opcodes (c'est-à-dire ce qui est réellement exécuté par le moteur) en PHP7, et mélanger PHP / HTML ne "sauve certainement pas l'électricité" en évitant de passer du texte statique. <?php $foo='ABC'; echo '<div>', $foo, '</div>'et <?php $foo='ABC'; ?><div><?=$foo?></div>aboutissent aux mêmes opcodes exacts, c'est-à-dire qu'ils sont identiques.
Josh de Qaribou du
En ce qui concerne les systèmes de modèles, l'approche de modèles la plus simple qui permettrait à votre exemple est un hérédoc simple. Heredoc vous permet de dire <li>{$thing}</li>comme vous l'avez montré, avec l'avantage sur les guillemets doubles que vous n'avez pas à échapper aux guillemets doubles à l'intérieur. Vous pouvez également attribuer heredoc ou le passer à des fonctions, il est donc beaucoup plus propre que php / html si vous l'utilisez en blocs, par exemple. array_reduce($items, function($s, $item) { $name = htmlspecialchars($item['name']); return $s . <<< EOT <li>{$name}: {$item['price']}</li> EOT; })
Josh de Qaribou du
4

Vous apprenez, oubliez les performances dans les pages PHP. Choisissez plutôt la manière la plus facile à lire .

En regardant vos deux exemples, le deuxième est certainement le plus facile à lire, bien que je pense que c'est à cause de l'espacement que vous avez utilisé. Vous dites que vous cherchez à développer de bonnes habitudes dès le départ, je pense que votre temps peut être mieux utilisé en faisant bien lire votre code. Cela peut signifier la réécriture d'une section plusieurs fois jusqu'à ce que vous en soyez satisfait.

Si vous aimez vraiment les coulisses, je vais vous expliquer ce qui se passe avec le contenu statique dans une page PHP. L'une des premières choses consiste à "analyser" la page entière en code exécutable (comme vous le voyez entre les <?php ?>balises). Une partie de cela consiste à transformer tout texte statique en un echo.

Donc ça:

<?php echo "Hello World"; ?>
<br />
<?php echo "Welcome"; ?>

est transformé en quelque chose comme:

echo "Hello World";
echo "<br />";
echo "Welcome";

Il y a un coût très faible associé à l'analyse, mais aucune différence dans l'exécution du code résultant. Si vous utilisez un accélérateur PHP, l'analyse n'est effectuée qu'une seule fois, puis mise en cache, vous ne verrez donc aucune différence de performances après le premier chargement de la page.

N'oubliez pas: facile à lire!

GavinH
la source
1
Je ne suis pas d'accord. Il ne s'agit pas seulement de la performance, il s'agit en fait d'apprendre. Ce n'est pas un bon conseil d'apprendre une mauvaise pratique.
Isaac
Ce n'est pas vrai que le "texte statique" est transformé en un echo, si vous voulez dire littéralement (ce que votre langue implique). Le résultat est le même, mais les méthodes sont très différentes. Ce que vous appelez "texte statique" échappe en fait de PHP à HTML. Lorsque cela se produit, le serveur commence à envoyer du texte brut. Il ne l'analyse pas via PHP, comme il le ferait avec echo. Les implications en termes de performances sont probablement faibles dans toutes les circonstances non artificielles, mais la différence mécanistique est importante.
underscore_d
0

L'une des meilleures fonctionnalités de PHP est qu'il est conçu pour être intégré dans HTML. Il est généralement utilisé pour créer des modèles. Il facilite la lecture et la maintenance de votre code, car il sépare le code PHP du code HTML.

Mais si vous imprimez uniquement une page statique comme "Hello World!" C'est une mauvaise idée.

4ldrich
la source
0

Pour répondre simplement à votre question: étant donné votre exemple de code, il y aura peu ou pas de différence de performance. PHP est traité au niveau du serveur / hôte tandis que HTML est traité par l'agent utilisateur / la personne qui regarde votre page Web sur leur navigateur. Qui sera plus rapide? Difficile à déterminer.

Je suis d'accord avec les autres pour dire que chacun a ses forces et ses faiblesses et peut très bien fonctionner ensemble. PHP est programmable et peut faire des calculs et travailler avec des variables. Pour cette raison, toutes mes pages finissent par être PHP et font appel à des extraits de code HTML - des modèles comme cela a été mentionné et insère des variables pour que mon HTML devienne dynamique.

Dans votre exemple, vous pouvez enchaîner le code HTML en une seule instruction PHP comme ceci:

    <?php echo "Hello World<br>Welcome"; ?>

J'espère que cela clarifie un peu.

Michael Moriarty
la source
0

il existe des limites à l'utilisation de HTML dans PHP.

La plupart du temps, vous auriez votre code HTML à l'extérieur. Vous créeriez une page comme vous le feriez si vous n'utilisiez pas PHP, puis ajoutez le PHP dans les zones du document où vous en avez besoin. Vous pouvez avoir plusieurs morceaux de PHP dans un document.

Travailler avec PHP Inside HTML a quelques exemples:

https://www.thoughtco.com/php-with-html-2693952

Purvi Barot
la source
-1

Il est généralement considéré comme une mauvaise forme de sortie de code HTML à partir de PHP. Il y a plusieurs raisons à cela, mais la principale est qu'il est plus facile, surtout à long terme, de maintenir le code si le code HTML et le code PHP sont séparés.

C'est comme HTML, CSS et Javascript; il est juste beaucoup plus facile et plus pratique de le séparer.

Techniquement, cependant, cela ne fait absolument aucune différence sur la façon dont vous sortez les choses. Pour PHP, ce ne sont que des octets de suite.

Sverri M. Olsen
la source
6
Cela fait une différence. <?php echo 'hello'; ?>est passé à PHP. hellon'est pas transmis à PHP. Tout ce qui est passé à PHP est converti en bytecode puis interprété. Cela prend du temps, de la puissance de traitement et de l'électricité.
Ted