通过PHP插入HTML的最佳方法是什么?

2022-08-30 15:14:43

从“最佳实践”的角度来看,您认为使用PHP插入HTML的最佳方法是什么。目前,我使用以下方法之一(主要是后者),但我很好奇您认为哪种方法最好。

<?php
  if($a){
?>
[SOME MARKUP]
<?php
  }
  else{
?>
[SOME OTHER MARKUP]
<?php
  }
?>

反对:

<?php
  unset($out);
  if($a) $out = '[SOME MARKUP]';
  else $out = '[OTHER MARKUP]';
  print $out;
?>

答案 1

如果你要以这种方式做事,你想把你的逻辑和设计分开,这是真的。

但是您不需要使用Smarty来执行此操作。

优先事项是关于心态。我见过人们在Smarty中做一些令人震惊的事情,它最终会变成人们在Smarty开发网站,然后一些明亮的火花会决定他们需要在Smarty中编写一个模板引擎(永远不要低估一个愚蠢想法的潜力)。

如果你把你的代码分成两部分,强迫自己遵守一个标准,那么你会得到更好的性能。

PageLogic.php

<?php 

  $pageData = (object)(array());  // Handy trick I learnt. 

  /* Logic Goes here */


 $pageData->foo = SomeValue; 

 ob_start(); 
 require("layout.php"); 
 ob_end_flush();

布局.php

 <html>
   <!-- etc -->
   <?php for ( $i = 1; $i < 10; $i++ ){ ?>
    <?php echo $pageData->foo[$i]; ?>
   <?php } ?>
   <!-- etc -->
</html>

PHP是作为模板引擎编写的,所以你至少应该在评估是否需要深入研究Smarty之前尝试使用它来完成它的设计任务。


此外,如果您决定使用模板引擎,请尝试获取一个默认转义HTML的引擎,然后“选择退出”而不是“选择加入”。您将为自己节省很多XSS的麻烦。Smarty在这方面很弱,正因为如此,有很多内容天真的模板写在上面。

{if $cond}
    {$dangerous_value}
{else}
    {$equally_dangerous_value}
{/if}

通常是智能模板的方式。问题是$dangerous_value可以是任意的HTML,这只会导致糟糕的编码实践,到处都是无法追踪的意大利面条代码。

您考虑的任何模板语言都应该满足这一问题。例如:

{$code_gets_escaped} 
{{$code_gets_escaped_as_a_uri}}
{{{$dangerous_bare_code}}}

这样,在模板中可以很容易地识别出潜在的剥削门道,而剥削的门道是默认行为。


答案 2

-1 对于典型的歇斯底里的“使用[我最喜欢的模板系统]代替!”的帖子。每个PHP帖子,即使原生PHP答案是单行的,也总是退化成这个,就像每个单行JavaScript问题最终都充满了“使用[我最喜欢的框架]代替!”。这很尴尬。

说真的,我们知道如何将业务逻辑和表示问题分开。你可以在任何模板系统中这样做——或者这样做——无论是PHP、Smarty还是完全不同的东西。没有模板系统可以神奇地将你的关注点分开,而没有一堆思考。

(事实上,限制性太强的模板系统最终可能不得不编写纯粹表示的辅助代码,使业务逻辑与表示问题混杂在一起。这不是一场胜利!

为了回答提出的问题,第一个示例是可以的,但由于缩进不良,因此很难阅读。请参阅monzee的示例以获取更具可读性的方式;您可以使用:表示法或{}s,无论您喜欢哪种,但为了提高可读性,重要的是将HTML和PHP保留为单个“格式良好”的缩进层次结构。

最后一个请求:记住htmlspecialchars()。每次纯文本需要进入网页时,都必须使用这个,否则它就是XSS。我知道这个问题与此没有直接关系,但是每次我们发布示例代码,包括< ?php echo($title) ? >或没有转义的框架等效物,我们都鼓励大多数PHP应用程序成为的安全灾难区域的延续。


推荐