【问题标题】:PHP within HTML etiquette [closed]HTML 礼仪中的 PHP [关闭]
【发布时间】:2013-12-18 02:14:17
【问题描述】:

这一直困扰着我很长一段时间,我想知道在 HTML 中编写 PHP 代码时的典型礼仪是什么。

我有以下代码:

<?php

    $country_list = array("AF"=>"Afghanistan", "AL"=>"Albania", "DZ"=>"Algeria");

    echo '<div class="some-class">
              <font color="red">Just some text.</font>
              <select>';

    foreach($country_list as $country_code => $country_name) {
        echo '<option value="' . $country_code . '">' . $country_name;
    }

    echo '</select>
          </div>';

?>

这对我来说看起来非常丑陋,因为 HTML 没有排列好,而且很难处理看起来不太好的东西。

有什么方法可以改进,让它看起来更好吗?用 HTML 编写这样的 PHP 代码时,是否有某种 PHP 礼仪?

谢谢。

【问题讨论】:

  • 没有人会看到真正的来源,除了你自己。这只是一个品味问题,如果它适合你,那就太好了。其他人将看到的唯一内容是 HTML 输出。正如我们在我住的地方所说的那样,“这不是时装比赛”。但是,如果以问题的形式出现,有些人可能会踢。 ;-)
  • 最简洁的方法是使用 javascript 将 HTML 与 PHP 完全分开。
  • @Dave 您的评论甚至没有任何意义。您认为没有理由生成动态页面?
  • 投票重新开放...这个问题当然不是主要基于意见的。肯定有几个正确答案,但并不多,StackOverflow 上几乎每个问题都是如此。
  • “主要基于意见” 就是这样。没有“固定礼仪”。如果 PHP 和 HTML 和 SQL 和 LMNOP/QRST 以及任何其他涉及的语言都可以在很好地协同工作的同时相处,那么让我们就这样吧。每个人都有自己的(特定的)风格来编写函数式代码(在一定程度上);这里的关键词是“功能性”。然而,我们确实需要遵循某些“准则”,但 Moe 会说一件事,Larry 会说另一件事,Curly 好……他是那个三人组中的oddball;他做他想做的事(但是......他的疯狂有一种方法)。 ;-)

标签: php


【解决方案1】:

通常的做法是将输出 HTML(“视图”)的代码与逻辑(通常在“控制器”中)分开。至少,这可以使用只处理输出的 PHP 代码来完成,但通常使用模板引擎来完成,例如 Smarty

如果您有一个简单的应用程序,那么模板引擎可能会过大。在这些情况下,您可以采取一些措施来清理您的代码:

  • 忽略 HTML 缩进。只需担心您在 PHP 中的代码缩进。无论如何,这对你来说很重要。如果您需要使用缩进的 HTML,请让您的浏览器的开发者工具为您操心。

  • 避免反复关闭/打开 PHP 标记。只要坚持echo。同样,如果您需要混合 PHP 和 HTML,以至于您觉得需要反复关闭/打开 PHP 标记,请考虑使用模板引擎。

最后,请务必在您输出到 HTML 的任意数据周围使用htmlspecialchars(),以确保生成有效的 HTML,并避免某些类型的 XSS 攻击漏洞。

【讨论】:

  • 我认为这是一个很好的问题,所有的答案都很有启发性。鉴于所有 PHP 代码在发送 html 之前都已处理,将所有代码放在一起(指您的“避免打开/关闭 PHP 标记”)与 ?
  • @TimSPQR 并非所有 PHP 代码都在发送 HTML 之前进行处理。这取决于应用程序和服务器配置。如果您想将一个变量回显到文档中,我认为打开/关闭标签很好,就像您的示例一样。您应该避免的是两者之间的大量混合,例如文森特的回答。这真是一团糟……不可读且有问题。
  • Oooooohhhhh...我假设所有服务器端代码都是在将数据传递给客户端之前的进程。很有意思。我会尝试更多地了解这一点。谢谢!
【解决方案2】:

这都是相当主观的东西,但你可以考虑只在绝对必要时才进入 PHP:

<div class="some-class">
    <font color="red">Just some text.</font>
    <select>
<?php

    $country_list = array("AF"=>"Afghanistan", "AL"=>"Albania", "DZ"=>"Algeria");

    foreach ($country_list as $country_code => $country_name) {
        printf('<option value="%s">%s</option>', $country_code, $country_name);
    }

?>
</select>
</div>

我假设你的价值观不需要在这里转义,即没有“淘气的国家”。

或者,有模板引擎可以帮助你,例如PHPTAL

<div class="some-class">
    <font color="red">Just some text.</font>
    <select>
        <option tal:repeat="country countries" tal:attributes="value repeat/country/key" tal:content="country" />
</select>
</div>

PHP 代码:

$tal = new PHPTAL('path/to/template');
$tal->set('countries', $countries);
echo $tal->execute();

这里的好处是一切都保持在 HTML 模式,并且您已经将显示逻辑(如何显示数据)与业务逻辑(如何生成数据)分开。

【讨论】:

    【解决方案3】:

    这是我经常做的事情

    <?php
        $country_list = array("AF"=>"Afghanistan", "AL"=>"Albania", "DZ"=>"Algeria");
        $countries = '';
         foreach($country_list as $country_code => $country_name) {
                $countries. = '<option value="' . $country_code . '">' . $country_name;
            }
    ?>
    

    //html部分

    div class="some-class">
                  <font color="red">Just some text.</font>
                  <select name="country>
    <?php echo $countries; ?>
    </select>
    </div
    

    【讨论】:

    • 该代码将仅包含数组中的最后一个国家/地区,您应该在循环之前声明国家/地区,即 $countries = '';然后在循环内它应该读取 $countries .= etcetc。
    • 谢谢,我忘记了
    【解决方案4】:

    你可以做这样的事情......我有时会这样做

    <?php
    $country_list = array("AF"=>"Afghanistan", "AL"=>"Albania", "DZ"=>"Algeria");
    ?>
    
    <div class="some-class">
         <font color="red">Just some text.</font>
         <select>
    
               <?php foreach($country_list as $country_code => $country_name) { ?>
                     <option value="<?=$country_code?>"><?=$country_name?></option>
               <?php } ?>
    
          <select>
    </div>
    

    【讨论】:

      【解决方案5】:

      不确定“礼仪”,但呼应 HTML 可能不是最好的主意。也许是这样的:

        <div class="some-class">
           Just some text
           <select>
           <?php
               foreach($country_list as $country_code => $country_name) {
           ?>
                  <option value="<?php echo $country_code;?>">
                       <?php echo $country_name; ?> 
                  </option>
           <?php
               }
           ?>
          </select>
         </div>
      

      所以尽量减少回显 HTML 标签。

      【讨论】:

      • 我完全不同意这种方法。在我看来,这会让你的代码变得一团糟。如果您不同意,您应该解释为什么您认为回显 HTML 是一个坏主意。
      • @Brad 我只是认为您应该尽可能地将逻辑与模板内容分开。 HTML 标记是模板代码的一部分,PHP 代码是逻辑的一部分。如此短的使用一些模板引擎我喜欢在逻辑中最小化回显 HTML。例如,这与您避免在 Java servlet 中回显 HTML 的原因相同。或者为什么 MVC 框架随处可见。
      • 在这个片段中,我认为 PHP 代码是视图的一部分,因为它有助于生成 HTML。
      • @VincentRamdhanie 您的示例使问题变得更糟。你没有分离任何东西。您正在混合您的 PHP 和 HTML。仅仅因为您没有在语法中使用 echo 并不意味着它仍然不是一团糟。缩进使它变得更加复杂。没有人可以浏览这段代码并立即看到发生了什么。 PHP 结构,例如 if block 和 foreach 不会因为 PHP 标记关闭而停止。
      猜你喜欢
      • 2012-11-02
      • 1970-01-01
      • 2012-05-21
      • 2012-03-07
      • 1970-01-01
      • 1970-01-01
      • 2012-12-06
      • 2011-01-15
      • 1970-01-01
      相关资源
      最近更新 更多