2014-10-17 97 views
0

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

[注意:以下代码没有给出我何时会使用此行为的一个很好的示例,但我保持它对演示目的]

<?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声明?然后<?= $adjective ?>就像在一个字符串中包含一个变量?

+0

您正在查看PHP的行为。这并不漂亮,我不建议这样编码,但如果您认为有必要,可以利用它。基本上,PHP并不关心''标签之外的任何内容,PHP之外的任何内容都会发送到浏览器。 – Crackertastic 2014-10-17 04:55:58

+0

http://php.net/manual/en/language.basic-syntax.phpmode.php – 2014-10-17 04:57:08

+0

@Tieson谢谢,但我读过,不幸的是它没有提及函数。 – 2014-10-17 05:01:22

回答

1

我似乎无法找到与PHP标签的块中的退出任何文件。但是,实际上只有少数转义HTML的地方可行。

  1. 正常使用

    <?php 
    
        php_related_code(); 
    
    ?> 
    
    //html/css/js/etc 
    
  2. 内的块,如同时,对,功能等

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

你能想到的?>stuff<?php类似回声或打印命令在PHP中找到,因为你可以在相同的地方转义回HTML。所以你可以在主脚本中回显,在for循环中,你可以在函数中回显。但是你不能在一个阵列呼应,例如:

<?php 

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

所以可以认为逃脱相同的作为呼应的,它可以告诉你哪里你可以使用它,但你不能做同样的事情,当你想到什么它。

它们的行为不同,并且由PHP处理的方式也不同。但你的问题只是询问任何限制,所以我不会介绍?><?phpecho之间的区别。

我忘了提及,<?=$variable?>只是<?php echo $variable; ?>的简写标签,如果您启用了此功能。

+0

感谢您的解释。我想我必须相信,他们不会在未来的更新中破坏任何功能(因为它是部分无证的行为),但这对许多事情都是如此。 – 2014-10-17 05:25:39

+0

我会建议创建一个小型模板引擎,基本上它不会转义为HTML,您只需拥有PHP代码和HTML,并且PHP将通过readfile/etc简单调用HTML。正如其他人所指出的那样,在PHP和HTML之间切换会产生无法维护的代码,所以我希望这是将您的代码添加到列表中的另一个原因,因为您不应该在代码中执行此操作。 – 2014-10-17 05:29:23

+0

我主要同意你的看法,但我并不是代码的主要开发人员,因此添加模板引擎带来的复杂性/抽象层不是一种选择。尽管如此,我会尽量保持混音。 – 2014-10-17 06:04:51

0

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

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

http://www.yiiframework.com/

还检查了这一点:https://www.youtube.com/watch?v=mhwfFgSzg7U

+1

我欣赏温柔的“微调”,但正如我在问题中所述,目前我无法使用框架,原因我在这里不会详述。这不是一个答案。 – 2014-10-17 04:56:02