我几乎到处都看到过这个约定,有时,它几乎使我发疯:

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


<?php和收盘?>分别存在行,即使没有中间的HTML代码。

我的问题是:为什么?为什么要包括所有这些额外的标签?

对我来说,这种约定似乎给代码增加了很多混乱,一开始很烦人,并增加了更多的地方以至于不小心遗漏了开始或结束标签。 br />
注意

这是从二十二主题(WordPress给出的示例)中提取的代码。

评论

另外,简写while语句= o

标记结束-此问题没有明确的答案,并且肯定不是WP特定的问题-使用PHP的任何人都将遇到此问题

@anu:首先,一个问题可能不一定总是有一个确定的答案(尽管它可能仍然是最佳答案)。该准则说“实用,负责”。其次,是的,从技术上讲,这是一个PHP问题,但是我在使用WP的短时间内看到了很多东西。因此,尽管这不仅限于WP,但在我看来,它具有足够的相关性,可以在WP设置中提出要求。

#1 楼

在任何WordPress样式指南中均不建议这样做,我认为这是一种不良的编码样式。初学者正在使用这种样式,可能是因为它感觉更像HTML……

不幸的是,默认主题经常使用这种样式,因此一些初学者可能会认为它是代码样式的一部分。 />
这种样式的一个缺点是注释处理。仔细看下面的示例,看看它不符合作者的预期:

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


祝您调试好运。 :)

规则:仅当必须创建两种语言的输出时,才在PHP和HTML上下文之间切换。在所有其他情况下,请使用常规换行符。

更新,进一步考虑:每个有效的HTML文件都是完整有效的PHP程序。是的,即使它不包含一行实际的PHP代码。

如果您从HTML开始并逐步添加PHP的小片段…您可能会得到我们在此讨论的样式。这就是重构的关键所在:一切都按预期运行后,重新编写代码,直到尽可能可读,易于维护和扩展,而无需重复任何部分。

我想有些人如果没有最后一步会很高兴,这就是为什么这种情况不会很快消失的原因。

评论


遗憾的是上面突出显示的语法没有显示该注释实际发生的情况...

– Webaware
2013年1月9日23:22

@webaware我认为这更能说明问题。 :)

– fuxia♦
2013年1月9日23:23

说“在任何地方都不建议这样做”太过分了。我建议这样做,尽管我很可能是少数派,但我已经提出了足够多的主题来提出半有效的意见:)。

–安迪·亚当斯(Andy Adams)
13年10月10日在1:06

@AndyAdams公平,我已表述为。现在走开,你这个邪恶的推荐者。 :)

– fuxia♦
2013年1月10日,1:14

主题使用这种样式,因为这样做太难看了。重构主题时,我希望将代码重写为尽可能可读,这意味着不要到处都有echo / printf / var_dump并将每个控件结构放在自己的<?对内。 ...?>使嵌套更容易理解。我要做的与OP示例不同的一件事是,我放了the_post();在自己的路线上。

– Lie Ryan
2013年1月10日下午4:16

#2 楼

虽然我避免使用PHP注释,但是我是模板文件中的狂热PHP开瓶器/关闭器。另一种选择是通过PHP字符串回显HTML,在我看来,这看起来更糟。作为原始示例:

<!-- 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>


示例2是否更冗长?也许?但我认为更容易阅读和编辑。您可以想象它对于复杂的HTML会变得多么丑陋。 >

评论


但是,} over endif的巨大优势在于(在许多编辑器中),您可以轻松地看到{的开头,因此是否已正确关闭了所有内容。尝试使用endif和一大堆条件函数来解决这个问题。

–user2015
2013年1月10日,1:10



foreach($ list_items as $ list_item)printf('
  • %2 $ s
  • ',$ list_item-> url,$ list_item-> name ); –两行,HTML和PHP很好地分开了。 :P

    – fuxia♦
    13年1月10日在1:18

    @toscho:你完全错了。您仍然在混合PHP和HTML,更喜欢第二种样式的人这样做是因为我们希望避免在PHP字符串中包含HTML。在将PHP用作模板语言时,我使用第二种样式,因为这是明智地嵌套PHP和HTML的混合物的唯一方法,而在将PHP用作脚本语言时,我使用第二种样式,因为通常没有充分的理由拥有HTML当您将应用程序逻辑与模板分开时,可以在脚本中使用。如果可以使用短标签,则第二种样式会更好: ...?>和<?= ...?>。

    – Lie Ryan
    13年1月10日,下午3:56



    @Piet:如果您在匹配大括号时遇到麻烦,您可能从未听说过缩进吗?同样,您应该能够配置为在任何体面的编辑器中突出显示endif的开头。

    – Lie Ryan
    13年10月10日在4:21

    @LieRyan很好。

    –稀有
    2013年1月12日14:09

    #3 楼

    这是关于在以下页面之间进行选择:



    作为完全由PHP生成的实体
    作为HTML文档模板,由PHP模板标签提供支持

    不同人们倾向于以不同的方式思考它。请注意,函数很少使用这种样式,因为它们更像纯PHP的块。另一方面,模板在模板中并不少见,因为它们在文件中分布更广,纯HTML的数量比PHP中的数量容易得多。等等)-它们看起来非常像这种样式,除了它们的语法趋向于消除普通PHP的冗长。

    PS我想指出的是,我讲的是PHP在HTML中的合理嵌入,而不是字面意义上的开放只是为了它而在每行上加上结束标签。

    #4 楼


    我的问题是:为什么?为什么要包含所有这些额外的标签?


    答案很简单:受众。当人们(不是程序员)抓住一个主题时,然后通过FTP传输安装,运行5分钟的安装程序等等,就好像对他们进行编程一样。然后,当他们想要在主题中添加或更改一行内容时,他们可能已经弄清楚了HTML是什么。 PHP仍然遥不可及。因此,我的猜测是,其背后的想法是允许更轻松地添加或删除元素,而又不会在出错时破坏所有内容。我就是这么想的。

    #5 楼

    我发现有些新程序员是通过这种方式培训的。我正在Lynda上进行为时40小时的课程,除功能定义外,讲师在每一行上都删除了PHP标签。这可能是为了清楚地在HTML和PHP之间划清界限,这可能有助于新人们了解HTML的结尾和PHP的起点。在那之后,这可能是一个习惯。我自己开始对此感到恼火,决定看看是否有人在抱怨。