Pourquoi avoir <? Php et?> Sur chaque ligne

24

J'ai vu cette convention à peu près partout, et, à certains moments, elle me rend presque fou:

<?php //The loop ?>
<?php while ( have_posts() ) : the_post(); ?>
    <?php the_content(); ?>
<?php endwhile; // end of the loop. ?>

Où le <?phpet la fermeture se ?>trouvent sur chaque ligne, même s'il n'y a pas de code HTML intermédiaire.

Ma question est: pourquoi? Pourquoi inclure toutes ces balises supplémentaires?

Pour moi, il semble que cette convention ajoute une quantité importante d'encombrement au code, est ennuyeuse à suivre en premier lieu et ajoute que beaucoup plus d'endroits pour laisser accidentellement à l'écart une balise d'ouverture ou de fermeture.

REMARQUE

Il s'agit d'un code tiré du thème Twenty-Twelve, l'exemple donné par WordPress.

Indigénéité
la source
aussi, sténographie tandis que les déclarations = o
Tom J Nowell
3
Signalement à proximité - il n'y a pas de réponse définitive à cette question, et il est certainement pas un problème spécifique WP - toute personne travaillant avec PHP face à ce problème
anu
3
@anu: Premièrement, une question peut ne pas toujours avoir une réponse unique et définitive (bien qu'elle puisse toujours avoir une meilleure réponse). Les directives disent "pratique et responsable". Deuxièmement, oui, c'est techniquement un problème PHP, mais j'ai vu beaucoup, beaucoup plus dans mon peu de temps avec WP. Donc, bien que cela ne se limite pas à WP, il me semble être suffisamment corrélé pour demander dans un paramètre WP.
Indigenuity

Réponses:

20

Ce n'est recommandé dans aucun guide de style WordPress, et je pense que c'est un mauvais style de codage. Les débutants utilisent ce style, peut-être parce qu'il ressemble plus au HTML…

Malheureusement, les thèmes par défaut utilisent ce style trop souvent, donc certains débutants pourraient penser qu'il fait partie d'un style de code.

Un inconvénient de ce style est la gestion des commentaires. Examinez attentivement l'exemple suivant et comment il ne fait pas ce à quoi l'auteur peut s'attendre:

<?php echo 'Important: '; // announcement ?>
<?php echo ' enter the word '; /* start ?>
<?php echo '<b>password</b>'; /* the end */ ?>

Bonne chance pour déboguer ça. :)

Règle: basculez entre le contexte PHP et HTML uniquement si vous devez créer une sortie dans les deux langues. Utilisez des sauts de ligne réguliers dans tous les autres cas.

Mise à jour, réflexions supplémentaires: chaque fichier HTML valide est un programme PHP complet et valide. Oui, même s'il ne contient pas une seule ligne de code PHP réel.

Si vous partez du HTML et ajoutez des petits morceaux de PHP pas à pas… vous pourriez vous retrouver avec le style dont nous discutons ici. C'est là que le refactoring entre en jeu: une fois que tout fonctionne comme prévu, réécrivez le code jusqu'à ce qu'il soit aussi lisible que possible, facile à maintenir et à étendre, sans répéter les parties.

Je suppose que certaines personnes sont heureuses sans cette dernière étape, et c'est pourquoi cela ne mourra pas bientôt.

fuxia
la source
C'est dommage que la syntaxe surlignée ci-dessus ne montre pas ce qui se passe réellement avec ce commentaire ...
Webaware
9
@webaware Je pense que cela illustre encore plus le problème. :)
fuxia
Vrai :) (plus quelques caractères pour garder la police des commentaires SE heureuse)
Webaware
2
@AndyAdams Très bien, j'ai reformulé cela. Et maintenant, va-t'en, mauvais parrain. :)
fuxia
3
Les thèmes utilisent ce style car faire autrement est tout simplement trop moche. Lors de la refactorisation des thèmes, je préférerais réécrire le code pour qu'il soit aussi lisible que possible, ce qui signifie ne pas avoir echo / printf / var_dump tout autour et mettre chaque structure de contrôle dans leurs propres paires <? ... ?>pour rendre l'imbrication plus facile à comprendre. Une chose que je ferais différemment de l'exemple du PO, c'est que je mettrais the_post();sa propre ligne.
Lie Ryan
12

Bien que j'évite cela pour les commentaires PHP, je suis un passionné d'ouvreur / plus proche de PHP dans les fichiers de modèle. L'alternative consiste à faire écho au HTML via des chaînes PHP, ce qui est encore pire à mon avis. À titre d'exemple primitif:

<!-- Example 1 -->
<ul>
    <?php
        foreach ( $list_items as $list_item ) {
            echo "<li><a href='" . $list_item->url . "'>" . $list_item->name . "</a></li>";
        }
    ?>
</ul>

<!-- Example 2 -->
<ul>
    <?php foreach ( $list_items as $list_item ) : ?>
        <li>
            <a href="<?php echo $list_item->url; ?>">
                <?php echo $list_item->name; ?>
            </a>
        </li>
    <?php endforeach; ?>
</ul>

L'exemple 2 est-il plus détaillé? Peut-être? Mais plus facile à lire et à éditer, à mon avis. Vous pouvez imaginer à quel point cela peut être laid pour du HTML complexe.

En outre, juste comme remarque: l'utilisation endforeachet endiflors de l'écriture de HTML entre votre logique PHP améliore la lisibilité d'une tonne par rapport à }.

Andy Adams
la source
5
l'énorme avantage de }plus endifcependant est que (dans de nombreux éditeurs) , vous pouvez facilement voir où l'ouverture {est donc de savoir si tout est bien fermé. Essayez de comprendre cela avec endiftout un tas de conditions ...
2
foreach ( $list_items as $list_item ) printf( '<li><a href="%1$s">%2$s</a></li>', $list_item->url, $list_item->name );- deux lignes, HTML et PHP bien séparées. : P
fuxia
4
@toscho: Vous avez totalement raté le point. Vous mélangez toujours PHP et HTML, les gens qui préfèrent le deuxième style le font parce que nous voulons éviter d'avoir du HTML dans la chaîne PHP. J'utilise le deuxième style lorsque j'utilise PHP comme langage de modèle, car c'est la seule façon d'imbriquer judicieusement un mélange de PHP et de HTML, tandis que j'utilise le premier lorsque j'utilise PHP comme langage de script, car il n'y a généralement aucune bonne raison d'avoir HTML dans le script lorsque vous séparez la logique d'application du modèle. Le second style serait encore meilleur si des balises courtes étaient disponibles: <? ... ?>et <?= ... ?>.
Lie Ryan
1
@Piet: si vous avez des problèmes pour faire correspondre les accolades, vous n'avez probablement jamais entendu parler de l'indentation? En outre, vous devriez être en mesure de configurer pour mettre en évidence l'ouverture de endiftous les éditeurs décents.
Lie Ryan
4
@LieRyan Soyez gentil.
Rarst
10

Il s'agit de choisir entre voir la page comme:

  • en tant qu'entité entièrement générée par PHP
  • en tant que modèle de document HTML, alimenté par des balises de modèle PHP

Différentes personnes ont tendance à y penser différemment. Notez que les fonctions utilisent rarement ce style, car elles ressemblent plus à des blocs de PHP pur. D'un autre côté, ce n'est pas rare dans les modèles car ils sont plus répartis sur les fichiers et la quantité de HTML pur peut être facilement supérieure à celle de PHP.

Si vous regardez les moteurs de modèles (Moustache, Twig, etc.) - ils ressemblent beaucoup à ce style, sauf que leur syntaxe a tendance à éliminer la verbosité du PHP ordinaire.

PS Je tiens à noter que je parle de l' intégration saine de PHP dans HTML, et non littéralement d' ouvrir et de terminer des balises sur chaque ligne juste pour le plaisir.

Rarst
la source
2

Ma question est: pourquoi? Pourquoi inclure toutes ces balises supplémentaires?

La réponse est assez simple: le public. Lorsque les gens (pas les programmeurs) saisissent un thème, puis FTPing leur installation, l'exécution de la configuration 5min et ainsi de suite se sent déjà comme la programmation pour eux. Quand ils veulent ensuite ajouter ou modifier une seule ligne de tout dans leur thème, ils ont peut-être déjà compris ce qu'est le HTML. PHP sera encore loin de leur portée. Donc, je suppose que l'idée derrière cela est de permettre l'ajout ou la suppression d'éléments plus facilement sans casser tout ce qu'ils font.

Remarque: ce n'est pas ce que j'aime, préfère ou recommanderais. C'est juste ce que je pense pourquoi cela se produit.

kaiser
la source
0

J'ai constaté que certains nouveaux programmeurs sont formés de cette façon. Je suis un cours de 40 heures sur Lynda et l'instructeur supprime les balises PHP sur chaque ligne, à l'exception des définitions de fonction. C'est probablement pour tracer clairement des lignes entre HTML et PHP, ce qui aide probablement les nouvelles personnes à comprendre où HTML se termine et PHP commence. Après cela, c'est probablement une habitude. Je commençais à m'énerver et j'ai décidé de voir si quelqu'un d'autre se plaignait.

Kitt Parker
la source