哪个更好:将HTML包含在PHP代码之内还是之外?


28

看这个:

<?php
echo "Hello World";
?>
<br />
<?php
echo "Welcome";
?>

现在看一下:

<?php
echo "Hello World";
echo "<br />";
echo "Welcome";
?>

(至少从性能的角度来看)以上示例中的哪一个更好?

我知道这些示例很简单,但是我想从一开始就遵循良好的实践习惯,因此,当我有越来越多的台词时,它们不会影响性能或其他负面影响。


14
在PHP中,这似乎并没有广泛流行,但是请注意,在其他生态系统中,两者都被认为是不好的,正确的选择是使用最小的逻辑创建所有静态部件的模板以包含动态部件,然后从编程语言。

1
@delnan-您应该考虑以稍微扩展的形式将其发布为答案。那很干净。
jmort253

@ jmort253已经考虑过了,但是我对PHP的了解很少,所以我无法说出PHP世界中的最佳实践。

您要解决什么问题?
Jim G.

就性能而言,这无关紧要。相比之下,网络要慢得多。转移成本明显更高,因此与之相比,发电成本微不足道。
马丁·约克

Answers:


23

正如评论所指出的,它应该由模板来完成。但是,如果只有两种选择是可能的。情况1会更好。这与android通过xml扩大布局或以编程方式制作UI的概念相同。您<br/>是html的静态内容,服务器将要做的只是显示它。但是,如果您使用php来执行它,它将使用您的服务器资源并进行计算。

这是应该做的事情:index.php:

<?php
include 'header.html';
...
include 'footer.html';  
?>  

header.html和footer.html是模板。


1
我读过凯文·扬克(Kevin Yank)的书,它是“ Ninja的PHP和MySQL新手”,其中涉及控制器和模板。您是在跟我说这些吗?还是不同?如果它们相同,如何将代码放入不同的文件中以使其性能更好?
2012年

模板使您的网站或应用程序更具吸引力。您是否看到StackOverflow的页眉和页脚甚至是帖子如何?他们正在使用相同的模板,并用动态数据填充它。
wtsang02

这背后的主要原因是什么?如果我们不那样做怎么办?我们将失去什么?
拉希德

让我们来看一下。这是此答案帖子的第4条评论。如果您现在在源代码上查看此页面,您将看到“ <div> <span ...> ... </ span> <a ...> ... </a>”,这是第4000条注释的编码手。那可能吗?或者只是将其作为模板,并在需要时让服务器“添加”此文件。
wtsang02

1
此外@wtsang,你永远只有这两个选择,你总是有第三个,运行(或学习)
ocodo

54

要直接回答您的问题:切勿回显静态文本或HTML。将其保留在PHP之外。

<?php echo "<p>Hello World</p>"; // Alway wrong. ?>

<p>Hello World</p>  <!-- Does the same thing, faster, and is more readable. -->

如果您要做的只是传递静态文本或静态html,转义到PHP就是浪费。里面的所有代码<?php ?>都发送到PHP进行解释。这意味着如果无缘无故将大量静态文本传递给PHP,则您的网站速度会变慢,并且会浪费电力。(有时是有原因的。)

最佳实践是让您的逻辑和专心致志地在没有任何HTML(只有PHP)的文件中工作。

我喜欢这样做的方法是使用MVC框架。我在模型和控制器中有纯PHP,在视图中有HTML和PHP的混合。您不需要MVC框架。您可以将HTML的混合粘贴在模板文件中,然后将其包含在纯PHP文件中。

一旦在纯PHP文件中创建了变量(其中不包含HTML),您就可以使用HTML将其传递给文件。在那儿,只有在那儿,将HTML和PHP混合使用才可以。但是,这很重要,但是在处理具有HTML的文件时,请将PHP保持在最低限度。

幸运的是,PHP附带了友好的工具,使PHP与html混合使用时更易于阅读。

替代语法

最佳实践是在编写纯PHP时使用常规PHP语法,而在混合PHP和HTML时使用替代语法。

在没有任何HTML的常规PHP文件中:

if ($something) {
  do_something(); // do_something() shouldn't echo or print.
}

这对于纯PHP来说很漂亮,但是从HTML转义时并不理想。特别是,当右括号出现在大量HTML中时,通常很难理解。

根据您的问题,您可能会在混合HTML和PHP的文件中看到以下内容:

<?php
  if ($something) {
    echo '<p>Hello World.</p>';
  }
?>

由于上述原因,我们希望不要将HTML发送给PHP。我们这样做是这样的:

<?php if ($something) { ?>
  <p>Hello World.</p>
<?php } ?>

我们从PHP标签中提取了HTML,这是一个改进。但是我们可以走得更远。

请注意,右括号的内容不详?我们不知道它是关闭循环还是if语句。在上面的示例中,这似乎是微不足道的,但是在循环/结束循环中,如果在if / endif内部通常包含数十行HTML。

最佳实践是在混合PHP和HTML的文件中,使用替代语法,该语法省略了大括号({ })和右括号():

<?php if ($something): ?>
  <p>Hello world.</p>
<?php endif; ?>

除了新语法(:和,endif;而不是{and })的语义外,您还应该注意两点:

  1. 同样,HTML和文本虽然受PHP控制,但仍位于<?php ?>标记之外,因此不会被解释。由于上述原因,这很好。
  2. 这比如果所有的php都包括包括随机结束括号(<?php } ?>)的php信息要多得多,它们会关闭很难找到它们在哪里打开的东西(因为它们与大量混乱的HTML混合在一起)。再次,设想一个带有循环和if语句的大HTML文件。指定您要关闭的内容可以澄清很多。

相同的模板友好语法也可以用于循环:

<?php foreach ($things as $thing): ?>
  <li><?php echo $thing; ?></li>
<?php endforeach; ?>

短标签

PHP提供的另一个很棒的工具,即短标签,是将PHP和HTML混合在一起时只想使用的工具。您可能必须在php.ini文件中打开短标签。一旦打开,短标签将使所有内容更具可读性。

如果没有短标签,则必须编写,<?php echo $something; ?>但是如果有短标签,则可以编写<?=$something?>,其结果将完全相同。

当结合短标签和替代PHP语法时,您实际上可以编写一些优雅的HTML文件,其中包括PHP元素。以我们的最后一个循环示例(循环中的一部分)为例,短标签使我们可以减少:

<li><?php echo $thing; ?></li>

<li><?=$thing?></li>

更具可读性。

我们可以走得更远吗?是。使用各种模板系统,您可以执行以下操作:

<li>{thing}</li>

这是惊人的可读性。但是,模板系统远远超出了原始问题的范围(无论如何我之前还是提到过)。


4
+1对于每个人都是好的建议。替代控件语法和短标签对于模板入门以及逻辑与表示的分离非常重要。
Will Meldon 2012年

1
短标签应谨慎使用。如果您正在构建将被重用的代码,则不能保证该short_open_tag指令将始终处于打开状态。PHP 5.4 <?=$thing?>始终保持可用状态,即使short_open_tag已禁用也是如此。另外,short_open_tag默认设置为off以防止与XML冲突。
克里斯

3
+1用于显示不同的选择,从而获得最佳答案。
Tola Odejayi

1
也许以前是真的,但是我只是检查了PHP7中的操作码(即引擎实际运行的代码),并且混合PHP / HTML肯定不会通过避免传递静态文本来“节省电能”。<?php $foo='ABC'; echo '<div>', $foo, '</div>'<?php $foo='ABC'; ?><div><?=$foo?></div>导致完全相同的操作码,即它们是相同的。
来自Qaribou的Josh,2015年

关于模板系统的注意事项,最适合您示例的模板方法是一个简单的Heredoc。Heredoc让您<li>{$thing}</li>像显示的那样说,与双引号相比,它的优点是您不必在其内部转义双引号。您还可以分配heredoc或将其传递给函数,因此,如果在块中使用它,则它比php / html更加干净。array_reduce($items, function($s, $item) { $name = htmlspecialchars($item['name']); return $s . <<< EOT <li>{$name}: {$item['price']}</li> EOT; })
来自Qaribou的Josh,2015年

4

您正在学习,忘记了PHP页面的性能。相反,请选择最容易阅读的方式

查看您的两个示例,第二个绝对是最容易阅读的,尽管我认为这是因为您使用了间距。您说您希望从一开始就养成良好的习惯,我认为通过良好地阅读代码可以更好地花费时间。这可能意味着多次重写一个节,直到您对它满意为止。

如果您真的很想了解幕后知识,我将向您解释PHP页面中的静态内容会发生什么。第一件事就是将整个页面“解析”为可执行代码(就像您在<?php ?>标记之间看到的那样)。其中的一部分是将任何静态文本转换成echo

所以这:

<?php echo "Hello World"; ?>
<br />
<?php echo "Welcome"; ?>

变成了类似的东西:

echo "Hello World";
echo "<br />";
echo "Welcome";

与解析相关的开销很小,但是执行结果代码没有区别。如果您使用的是PHP加速器,则解析仅进行一次,然后进行缓存,因此在第一页加载后,您不会发现性能差异。

记住:容易阅读!


1
我不同意。这不仅与性能有关,而且实际上与学习有关。学习错误的做法不是一个好的建议。
艾萨克(Isaac)2013年

echo如果从字面上(您的语言所暗示的意思)将“静态文本”转换为,是不正确的。结果是相同的,但方法却大不相同。您所谓的“静态文本”实际上是从PHP到HTML的转义。发生这种情况时,服务器开始发送原始文本。它不会像通过那样通过PHP解析它echo。在任何非人为情况下,对性能的影响可能很小,但是机械上的差异很重要。
underscore_d

0

PHP的最佳功能之一是被设计为嵌入HTML。通常用于创建模板。它使PHP代码与HTML分离,从而使您的代码更易于阅读和维护。

但是,如果您仅打印静态页面,例如“ Hello World!”。这是一个坏主意。


0

简单地回答您的问题:给定示例代码,性能几乎没有差异。PHP在服务器/主机级别进行处理,而HTML由用户代理/人员在浏览器上查看您的网页的过程处理。谁会更快?难以确定。

我同意其他人的说法,即每个人都有自己的长处和短处,可以很好地合作。PHP是可编程的,可以进行计算并可以使用变量。因此,我所有的页面最终都是PHP,并调用HTML代码段(如前所述),并插入变量以使HTML变为动态。

在您的示例中,您可以将HTML串在一起成为一个PHP语句,如下所示:

    <?php echo "Hello World<br>Welcome"; ?>

希望可以帮助澄清一些。


0

在PHP中使用HTML存在一些限制。

大多数时候,您会将HTML放在外面。您可以像不使用PHP一样创建页面,然后将PHP添加到文档中您需要的区域。您可以在文档中包含多个PHP块。

在HTML内部使用PHP包含一些示例:

https://www.thoughtco.com/php-with-html-2693952


-1

通常认为从PHP输出HTML代码是错误的形式。造成这种情况的原因有很多,但主要的原因是,如果HTML和PHP代码分开,则维护代码更容易,尤其是从长远来看。

就像HTML,CSS和Javascript一样;将其分开将更加容易和实用。

但是从技术上讲,您输出内容的方式绝对没有区别。对于PHP,它只是连续的字节数。


6
它的确有所作为。<?php echo 'hello'; ?>被传递给PHP。hello不会传递给PHP。传递给PHP的所有内容都将转换为字节码,然后进行解释。这需要时间,处理能力和电力。
Ted
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.