【问题标题】:Are there any restrictions on when you can mix HTML and PHP?何时可以混合使用 HTML 和 PHP 是否有任何限制?
【发布时间】:2014-10-17 04:51:09
【问题描述】:

我惊讶地发现您可以将 PHP 函数分解为原始 HTML 并返回。我知道你可以用循环和条件来做这种事情,但这对我来说是一个惊喜。这是一个意外还是这是定义明确的行为? (我在手册中找不到任何关于函数案例的明确讨论。)

[注意:下面的代码没有给出一个很好的例子来说明我什么时候会使用这种行为,但为了演示目的,我保持简单。]

<?php

$i = 0;

while($i++ < 3) {
    ?><p>I am in a while loop.</p><?php
}

// this part surprised me
function actSkeptical($adjective) {
    ?><p>Is it <?= $adjective ?> that this works?.</p><?php
}

actSkeptical("weird");
?>

输出:

I am in a while loop.

I am in a while loop.

I am in a while loop.

Is it weird that this works?

我知道有些人绝对讨厌像这样混合 PHP 和 HTML,但我不能做 OOP/模板(因为我不会在这里讨论的原因),我喜欢看到尽可能多的原始 HTML。

另外,我不太了解上面的短打开/关闭标记(输出$adjective)如何与周围代码一起工作的语义。 PHP 是否只是将原始 HTML 视为 echo 语句?然后&lt;?= $adjective ?&gt; 就像在字符串中包含一个变量?

【问题讨论】:

  • 您正在查看 PHP 的行为。它不漂亮,我不建议这样编码,但如果你认为有必要,它就可以使用。基本上,PHP 不关心&lt;?php ?&gt; 标记之外的任何内容,PHP 之外的任何内容都会发送到浏览器。
  • @Tieson 谢谢,但我已经读过了,不幸的是它没有提到功能。
  • @suchit 我看到很多人在混合 HTML 和 PHP 时使用 while/if/etc 的替代语法。除了认为它更具可读性之外,还有什么理由吗?

标签: php html mixing


【解决方案1】:

我似乎找不到任何与块内 PHP 标记退出相关的文档。然而,实际上只有少数地方转义到 HTML 可以工作。

  1. 正常使用

    <?php
    
        php_related_code();
    
    ?>
    
    //html/css/js/etc
    
  2. 块内,例如while、for、函数等

    <?php
    
    for ($i = 0; $i < 5; $i++) {
        ?>
    
        hello world
    
        <?php
    }
    
    $i = 5;
    while ($i-- > 0) {
        ?> hello there <?php
    }
    
    function myFunc() {
    ?>
        hello universe
    <?php
    }
    
    myFunc();
    

您可以将?&gt;stuff&lt;?php 视为类似于 PHP 中的 echo 或 print 命令,因为您可以在可以回显的相同位置转义为 HTML。因此,您可以在主脚本中、for 循环中回显,也可以在函数中回显。但是不能在数组中回显,例如:

<?php

$array = array(echo "here"); //not allowed
$array = array(?>here<?php); //also not allowed

因此,您可以将转义与回显相同,它可以告诉您在哪里可以使用它,但是当您考虑 时,您不能做同样的事情 是做什么的。

它们的行为不同,PHP 的处理方式也不同。但你的问题只是询问任何限制,所以我不会讨论?&gt;&lt;?php 和echo 之间的区别。

我忘了说,&lt;?=$variable?&gt; 只是&lt;?php echo $variable; ?&gt; 的短标记,如果你启用了这个功能的话。

【讨论】:

  • 感谢您的解释。我想我必须相信他们不会在未来的更新中破坏任何功能(因为它是部分未记录的行为)但很多事情都是如此。
  • 我建议创建一个小型模板引擎,基本上是一个永远不会转义为 HTML 的模板引擎,您只有 PHP 代码和 HTML,您的 PHP 将简单地通过 readfile/etc 调用 HTML。正如其他人所指出的那样,在 PHP 和 HTML 之间切换会产生无法维护的代码,所以我希望这是添加到您的列表中的另一个原因,即为什么您不应该在代码中这样做。
  • 我基本同意你的观点,但我不是代码的主要开发人员,因此添加模板引擎带来的复杂性/抽象层不是一种选择。不过,我会尽量减少混合。
【解决方案2】:

这称为意大利面条代码。不要使用它。

如果你真的想分离代码、逻辑和标记,就开始使用MVC; YII很棒。

http://www.yiiframework.com/

也可以看看这个:https://www.youtube.com/watch?v=mhwfFgSzg7U

【讨论】:

  • 我很欣赏这种温和的“轻推”,但正如我在问题中所说,我目前无法使用框架,原因我不会在此详述。这不是答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-15
  • 2014-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-09
相关资源
最近更新 更多