为什么每行都有<?php和?>


24

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

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

即使没有中间的HTML代码,也要在每行上加上<?php?>

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

对我来说,这种约定似乎给代码增加了很多混乱,一开始很烦人,而且还增加了许多意外地遗漏了开始或结束标签的地方。

注意

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


同样,简述while语句= o
Tom J Nowell

3
即将结束-此问题没有明确的答案,并且肯定不是WP特定问题-使用PHP的任何人都将面临此问题
2013年

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

Answers:


20

在任何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

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

正确:)(加上一些字符使SE评论警察满意)
webaware

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

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

12

虽然我避免使用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会变得多么丑陋。

此外,正如一个侧面说明:使用endforeachendif你的PHP逻辑增强其可读性之间编写HTML时,相比}


5
然而,}over 的巨大优点endif是(在许多编辑器中)您可以轻松地看到开口在哪里{,因此可以查看是否已正确关闭所有内容。尝试弄清楚这一点endif以及一大堆条件...

2
foreach ( $list_items as $list_item ) printf( '<li><a href="%1$s">%2$s</a></li>', $list_item->url, $list_item->name );行,HTML和PHP很好地分开了。:P
fuxia

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

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


10

这是关于将页面视为以下内容之间的选择:

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

不同的人倾向于以不同的方式思考它。请注意,函数很少使用这种样式,因为它们更像纯PHP的块。另一方面,在模板中并不少见,因为它们在文件中分布更广,纯HTML的数量比PHP中的数量容易得多。

如果您看一下模板引擎(Mustache,Twig等),它们看起来很像这种样式,只是它们的语法倾向于消除纯PHP的冗长性。

PS我要注意,我说的理智在HTML中嵌入PHP的,而不是从字面上就打开和结束标记行只是为了它的缘故。


2

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

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

注意:这不是我喜欢,不喜欢或不推荐的。我就是这么想的。


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.