web-dev-qa-db-fra.com

Échapper HTML à PHP ou utiliser Echo? Quel est le meilleur?

En termes de performances, quoi de mieux. Utiliser PHP pour faire écho à toutes les sorties HTML afin que je puisse les poivrer avec les différents bits de code et de variables de travail ou échapper HTML à php périodiquement dans les documents.

Je sais qu'il peut y avoir des problèmes de lisibilité, mais je ne suis pas inquiet à ce sujet.

Merci a tous!

Exemple 1

echo '<html>',
     '<body>',
     'The content of the ',$container,' element is displayed in your ', $other_container,
     '</body>',
     '</html>';

OR

<html>
<body>
The content of the <?php echo $container; ?> element is displayed in your <?php echo $other_container; ?>
</body>
</html>
41
William T Wild

C'est tout ce qui vous semble le plus lisible. Bien sûr, cela variera selon chaque situation. Si vous faisiez une page entière, et qu'il y avait de grandes sections qui n'avaient pas de PHP dedans, alors je sortirais de PHP et juste écrire le HTML brut, alors que s'il y avait une section qui avait beaucoup de variables PHP, je ferais tout en PHP.

Par exemple:

<table>
    <tr>
        <td colspan="<?php echo $numCols; ?>">
            <?php echo $a; ?>, <?php echo $b; ?>, and <?php echo $c?>
        </td>
    </tr>
</table>

contre:

<?php
echo "<table>"
    . "<tr>"
    .    "<td colspan=\"" . $numCols . "\">"
    .        $a . ", " . $b . " and " . $c
    .    "</td>"
    . "</tr>"
    . "</table>"
; ?>

Ou

<?php
echo "<table>
         <tr>
            <td colspan='{$numCols}'>
               {$a}, {$b}, and {$c}
            </td>
         </tr>
      </table>";
?>

N'oubliez pas non plus printf

<?php
printf("<table>"
    . "<tr>"
    .    "<td colspan=\"%d\">%s, %s and %s</td>"
    . "</tr>"
    . "</table>"
    , $numCols
    , $a
    , $b
    , $c
);
?>
33
nickf

celui qui est le plus facile à lire.

La différence de performances est assez négligeable par rapport à presque tous les autres problèmes que vous rencontrerez. La lisibilité est certainement la première question ici.

31
Stephane Grenier

Citons le manuel :

L'exemple donné ici est artificiel, bien sûr, mais pour sortir de gros blocs de texte, abandonner PHP parsing Le mode est généralement plus efficace que l'envoi de tout le texte via echo () ou print ().


Mais écoutez les autres et évitez ce type de micro optimisation et choisissez celle qui est plus lisible.

Puis-je proposer une troisième solution? Avez-vous entendu parler des moteurs de modèles? Ils vous aident à créer une séparation claire entre le code et la présentation, ce qui conduit généralement à un code plus propre et plus facile à maintenir. Un tel moteur de modèle populaire est par exemple smarty , mais il y en a des centaines avec des forces différentes.

22
Georg Schölly

Cela n'a aucun rapport avec la vitesse globale de votre application avec laquelle vous allez.

Cela étant dit, je sais que vous avez dit que vous ne vous en souciez pas, mais veuillez utiliser le deuxième car il est environ un million de fois plus facile à lire. Et la lisibilité est énorme.

8
Paolo Bergantino

Je ne connais pas les performances de cela, mais dans PHP vous pouvez également utiliser ce que je crois être appelé un "Heredoc", ce qui, je pense, aide à la lisibilité dans ce type de sortie.

Exemple de Nickf:

<table>
    <tr>
        <td colspan="<?php echo $numCols; ?>">
            <?php echo $a; ?>, <?php echo $b; ?>, and <?php echo $c?>
        </td>
    </tr>
</table>

devient:

<?php
echo <<<EOT
<table>
    <tr>
        <td colspan="$numCols">
            $a , $b, and  $c
        </td>
    </tr>
</table>

EOT;

?>

Je crois qu'en fin de compte la lisibilité est une chose subjective, donc votre kilométrage peut varier!

Ruth

8
notruthless

Il tombe dans le domaine des micro-optimisations. La plus grande partie de votre temps consiste à initialiser le moteur PHP démarrant le travail).

Donc, à moins que vous n'ayez un ordre de dizaines de milliers de lignes (ou même plus), vous ne devriez pas vous en préoccuper.

Pour ajouter, j'ai fait un petit test d'un million de lignes où j'ai utilisé php pour les imprimer et où j'ai utilisé php pour appeler un programme c qui faisait la même chose et la différence était minuscule.

Un peu plus d'infos.

Ce qui se passe dans le 2ème exemple, c'est que vous "allumez/éteignez" PHP, ce n'est pas exactement ce qui se passe mais pour cet exemple, il convient.

La chose qui devrait vous inquiéter le plus, est-ce que ce code aura beaucoup de logique autour de lui? Vais-je diviser cette chaîne en encore plus de chaînes ou même la placer à différents endroits? Est-ce la vue d'une application MVC?

Pour 1 et 2, cela pourrait être un tirage au sort entre les deux méthodes. Mais pour 3 j'irais avec la méthode 2 pour ces raisons.

Une vue dans une application Web MVC est principalement html/css. Je veux donc que cela soit formaté correctement et je veux voir dans mon éditeur la coloration html. C'est donc un plus.

5
Ólafur Waage

Codez comme si le prochain programmeur prenant en charge le projet était un tueur en série. En d'autres termes, utilisez la deuxième option que vous avez mentionnée.

3
Mario

Cela devrait être considéré plus comme un problème de lisibilité et de maintenance qu'un problème de performances.

Ainsi, l'option 2 présente quelques avantages concrets:

  1. Coloration du code. Avec l'option 1, tout est coloré comme une instruction d'écho, ce qui rend la lecture de HTML plus difficile.
  2. Intellisense - Avec de nombreux IDE, le HTML dans une instruction echo PHP n'engagera pas intellisense, donc vous taperez tout ce HTML à la main.
3
Cory House

En termes de performances ... ce n'est pas important. La lisibilité du code est primordiale, une infime fraction d'un pour cent de différence de performances ne changera rien.

La version HTML brute est généralement la plus facile à lire (et a probablement les meilleures performances aussi pour ce qu'elle vaut - mais ce qu'elle vaut: rien). Ce n'est pas une surprise: PHP est un langage de template HTML, l'ensemble point entrelace le HTML au niveau de la syntaxe du langage.

Regardez le code de nickf pour voir comment le garder lisible. Le retrait est important! Mettez un niveau d'indentation à l'intérieur de chaque structure de contrôle PHP aussi, afin que vous puissiez les suivre. Par exemple:

<?php if ($error) { ?>
    <p> Oh no, error! </p>
<?php } ?>

Enfin, lors de la sortie de contenu, tel que $ container dans votre exemple, vous devez toujours le htmlspecialchars (), ou vous aurez une application pleine de trous de sécurité pour l'injection HTML, comme tous les autres PHP débutant (et même de nombreux développeurs professionnels, malheureusement). Cela importe quelle que soit la méthode que vous utilisez pour produire du contenu.

Étant donné que htmlspecialchars est un nom de fonction assez long, vous pouvez essayer de définir votre propre fonction de raccourci:

<?php
    function h($s) {
        echo(htmlspecialchars($s, ENT_QUOTES));
    }
?>

<ul>
    <?php foreach ($things as $thing) { ?>
        <li> <?php h($thing['name']) ?> </li>
    <?php } ?>
</ul>
3
bobince

Je préfère utiliser la fonction php heredoc , de cette façon je n'ai pas besoin d'échapper à aucun caractère, ex:

<?php

$title = "heredoc is cool!!!";
$mySite = "http://www.php.net";

echo <<<LOL
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
<head>

  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <meta name="viewport" content="width=device-width, initial-scale=1.0"> 

  <title> $title </title>

 <link rel="shortcut icon" href="$mySite/favicon.ico">
 <link rel="search" type="application/opensearchdescription+xml" href="$mySite/phpnetimprovedsearch.src" title="Add PHP.net search">
 <link rel="alternate" type="application/atom+xml" href="$mySite/releases/feed.php" title="PHP Release feed">
 <link rel="alternate" type="application/atom+xml" href="$mySite/feed.atom" title="PHP: Hypertext Preprocessor">

 <link rel="canonical" href="$mySite/manual/en/language.types.string.php">
 <link rel="shorturl" href="$mySite/types.string">

 <link rel="contents" href="$mySite/manual/en/index.php">
 <link rel="index" href="$mySite/manual/en/language.types.php">
 <link rel="prev" href="$mySite/manual/en/language.types.float.php">
 <link rel="next" href="$mySite/manual/en/language.types.array.php">
LOL;
?>

Remarque:

Le texte Heredoc se comporte comme une chaîne entre guillemets doubles, sans les guillemets doubles. Cela signifie que les guillemets dans un heredoc n'ont pas besoin d'être échappés, mais les codes d'échappement répertoriés ci-dessus peuvent toujours être utilisés. Les variables sont développées, mais il faut faire preuve de la même prudence lors de l'expression de variables complexes à l'intérieur d'un hérédoc qu'avec des chaînes.

2
Pedro Lobito

Pour les petits morceaux, je garde le tout dans les chaînes PHP, comme lorsque vous parcourez un tableau pour générer une liste. Mais pour les piles de balisage plus importantes, je garde cela hors de la PHP et déposez simplement dans PHP si nécessaire.

C'est en grande partie parce que je préfère optimiser la maintenabilité. Non seulement parce qu'il est plus rapide de voir ce qui se passe lorsque le HTML a la mise en évidence de la syntaxe appropriée appliquée, mais parce qu'il rend également moins susceptibles de se produire des erreurs résultant d'une lecture défectueuse du code.

Il n'y a vraiment pas de meilleur moyen. J'essaie simplement de rester cohérent avec ce qui est décrit ci-dessus et de garder les yeux ouverts pour les situations où peut-être que l'autre façon serait une meilleure façon de le gérer.

2
Trevor Bramble

Vous devriez sérieusement envisager de ne jamais placer PHP à l'intérieur de HTML. Vous mélangez la logique avec la vue qui rend un projet désordonné.

Comme d'autres l'ont dit, si vous effectuez une sortie en html, utilisez <?php echo $whatever; ?>

Si vous devez produire une tonne d'informations, examinez la mise en mémoire tampon de sortie.

1
Syntax

Ce dernier est beaucoup plus lisible. Il est également plus facilement modifiable (vous n'avez pas à échapper les guillemets en HTML, par exemple). Et il préserve les espaces sans tracas, ce qui peut être préféré, en particulier à des fins de débogage.

Je souhaite presque PHP permettrait à print() et echo() de convertir automatiquement les caractères HTML afin que les gens cessent de les utiliser pour générer du HTML.

1
eyelidlessness