首选的将PHP和HTML结合的方式是什么?

9
我通过攻击phpBB2来学习PHP,甚至向他们的数据库提交了一些修改,其他人下载并使用了这些修改。(我认为phpBB2已经不再支持,现在有phpBB3,所以v2修改数据库已经不存在。) phpBB中我最喜欢的事情之一是他们的模板系统,它可以完全将HTML和PHP分离开来。PHP文件包含PHP:逻辑、数据库查询和激活模板。TPL文件包含模板:HTML、模板变量和特殊的HTML注释,以允许条件或重复块。
然而,每当我在网上看到别人的PHP代码时,要么是一个小片段,只涉及一个函数等,要么是PHP充满了包含HTML的字符串(或更糟糕的是,HTML与PHP交错)。phpBB是我看过的唯一将语言和标记语言分开的PHP,这表明很少有其他PHP代码库会这样做。
我想开始重新使用一些PHP,但这次不是phpBB论坛,而是在一个团队中。根据我的经验,将PHP和HTML分离是不常见的(如果我有错请纠正我!)。然而,我习惯了那条分界线,讨厌阅读混合PHP和HTML的内容。
在PHP编程的“真实世界”中,什么是首选方法:
  • 带有HTML字符串的PHP文件
  • 被PHP块打断的HTML文件
  • PHP和HTML完全分开(我希望?)
  • 还有其他方法吗?
9个回答

7

我认为这正是我想要在PHP中开发的类型,而不是依赖于phpBB。 - Brian S

5

个人而言,我认为在PHP已经是一个完美的解决方案时,没有必要将模板系统/语言加入其中。

我更喜欢的方法是将应用程序的显示与逻辑分开。这可以采用完整的MVC框架形式。但是,也可以通过编写代码的方式来实现。

扩展:

自从我犯了将大量ASP代码与HTML混合的错误后,我就尝试将页面逻辑与显示分离。在单个页面中,这意味着将所有页面逻辑放置在顶部,将要显示的信息存储在变量中,然后在PHP文件底部的HTML中将它们输出。在HTML部分出现的唯一逻辑是显示逻辑。换句话说,简单的错误处理、if语句、循环等。基本上,这些都是大多数模板语言中所包含的内容。

我避免使用模板语言的原因是它又是我需要担心的另一种语法形式。这有什么意义?PHP提供的已经足够满足我的需求。

同时,您可以采用简单的MVC方法将事物分开:

controller.php

<?php
// some application logic
$data['message'] = 'Hello, World.';

include 'view.php';

exit;
?>

view.php:

<html>
<head>
<title>
A simple 'MVC' view
</title>
</head>
<body>
<p>
<?php

echo $data['message'];

?>
</p>
</body>
</html>

这种方法并非没有缺点和问题。然而,如果你认为可以在应用逻辑和显示之间实现完全的、清晰的分离,那就错了。


1
您能详细说明一下吗?PHP如何解决将PHP和HTML分离的问题?您能给我们举个MVC方法的例子吗?我理解MVC的概念,但我的周末大脑(只开了一半!)对于使用PHP的MVC来分离逻辑和展示方面还没有完全掌握。 - Brian S
谢谢您提供的详细答复。看起来您的建议与bobince提供的建议相似? - Brian S
@bobince 是的,基本上是这样。我回答的动机是警告不要使用模板系统。有些情况下它们可能很有用。比如说,如果你有一个专门负责前端的团队。然而,如果你知道 PHP 并且你负责 HTML(或者后端开发人员需要经常接触它),我认为模板系统通常是过度设计的。良好的编码实践可以在没有额外处理层的情况下实现相同的效果。 - George Marian
好的,我明白了。我提问的原因主要是因为我太习惯phpBB的模板了,所以我不喜欢阅读混合PHP和HTML的文件。我认为我可以处理这种程度的混合,虽然我习惯的东西与你的MVC示例之间唯一显着的区别可能是展示逻辑,而且如果展示逻辑开始变得特别复杂,这种方法甚至会更加优越(至少对于phpBB2来说)。 - Brian S
注意,如果您删除了包含和退出的调用,则可以在一个文件中完成此操作。这是我通常用于相对简单页面的方法。 - George Marian

4
我们使用一个定制的CodeIgniter基础框架来实现MVC,只是将逻辑和布局分离。这并不意味着我们的HTML中没有PHP,只是它不用于逻辑。在模板中使用PHP代码循环记录集是完全可以的,但不要尝试在布局模板中与业务对象交互并实际执行操作。当然,如果你真的想要摆脱所有的PHP代码,你也可以尝试像tal或其他无数的模板。我认为这大多数情况下都是过度设计,除非"插入特殊情况"。

3
每当我在网上看到别人的PHP代码时,要么是一个小片段只涉及单个函数,要么就是PHP充斥着包含HTML的字符串(或更糟糕的是,HTML和PHP混杂在一起)。
是的,外面的代码质量普遍令人尴尬。
虽然你可以使用自己的全功能模板引擎,但这可能过于复杂,在许多情况下,它们提供的有限领域特定语言会妨碍你,而你只需在PHP中编写表示逻辑即可。
如果您仍想正常编写PHP,但不希望出现混乱的代码:
  1. 将操作代码放在文件顶部或不同文件中。只放置应用程序逻辑,不放置任何HTML或模板。在此阶段生成的任何需要由模板显示的信息都需要放在变量中以传递给模板部分,而不是在大量业务逻辑中间打印出来。
  2. 利用基于标签的模板知识并将其应用于PHP。具有单个、正确缩进的层次结构的代码,用于HTML和PHP表示逻辑,就像您编写“格式良好”的XML一样(无论您是否实际使用XHTML)。尽量避免在字符串中放置HTML。
  3. 定义更轻松的调用htmlspecialchars()的方法,否则一直输入这些内容将会非常痛苦,如果您没有一直输入这些内容,则可能会出现潜在的安全敏感错误。
总之,例如:
<?php
    // active code here
    // do things
    // put any errors in a $errors array

    // this trivial function would presumably be in an include
    //
    function h($s) {
        echo htmlspecialchars($s, ENT_QUOTES);
    }
?>

<body>
    <?php if (count($errors)!=0) { ?>
        <ul id="errors">
            <?php foreach ($errors as $error) { ?>
                <?php h($error); ?>
            <?php } ?>
        </ul>
    <?php } ?>
    ...
</body>

在PHP编程的“现实世界”中,什么是首选方法?
哦,在PHP编程的“现实世界”中,平均项目都是一堆方法混合在一起而没有任何思考。在“现实世界”中,代码不可维护、充满错误和不安全。您不想看行业标准,因为行业标准在各个方面都会被打破。

你能给我指一下这种格式的非平凡项目的源代码吗?我喜欢这个概念,但我想看看它在更大规模上的可读性以及如何处理许多特定情况。 - Robert
3
不,我不能。我还没有遇到一个公开可用的 PHP 项目,其模板不是由许多迷宫般的 echo-HTML 组成且彼此相似。 - bobince

3

根据我的经验,大部分PHP开发(无论好坏)都是通过包含其他文件并在需要时打印出HTML片段的方式进行的。

需要注意的是,我的大部分PHP经验都是为了找到“只要能够工作就行”的解决方案,而不是最优雅和高效的解决方案。


这很有道理,它解释了我看到的所有代码,而我讨厌看它们。 - Brian S

2
我倾向于使用模板系统来最小化HTML文件中包含的PHP代码数量。我真的没有看到完全将PHP与HTML分离的方法,但我认为将业务逻辑(数据库)与演示逻辑分开是足够的。
我的模板系统是自制的,但我相信你可以通过进行谷歌搜索找到适合的各种模板系统。

2
根据我的经验,PHP和HTML的分离并不常见。
没错。但是很多PHP代码都是由经验不足的开发人员编写的。此外,PHP并不鼓励编写良好的代码,反而会阻碍这一点。将HTML与编程代码混合在一起就是其中的一个例子。
如果您希望编写高质量的代码,并能够轻松地维护和扩展它,我强烈建议使用模板引擎或类似的工具。混合使用会对您的代码可读性产生巨大影响,并导致其随着时间的推移变得越来越糟糕。如果不是不可能,重构也将非常痛苦。
现在,您可以选择多种方法来将HTML与PHP分离:
- 最显而易见的方法是使用现有的布局引擎。有很多这样的引擎,其中一些做得非常出色,对性能影响非常小。 - 您还可以编写自己的引擎。在大型项目中可能不是一个好主意(为什么要重新发明轮子?),但在小型项目或需要非常特定的解决方案时可能是一个解决方案。 - 我在大多数项目中使用的最后一种方式是从业务层构建XML(在PHP中进行XML序列化非常容易),然后使用XSLT将其转换为HTML页面。这使得网站更易于维护和理解,并且通过加载XML而不是HTML页面可以以编程方式访问网站数据。另一方面,它会极大地降低性能,因此不适用于每秒数千次查询的大型网站。

0

大多数代码都以PHP和HTML字符串开头,然后在大规模重写期间演变为模板系统。从一开始就将内容与逻辑分离需要团队进行设计、规划和沟通。使用XML或JSON而不是PHP数组作为数据格式可以使这个过程更加容易。


0

你可以通过在 HTML 代码中添加开头的 <?php 和结尾的 ?> PHP 标签来混合使用 PHP 和 HTML。

<!DOCTYPE html> 
  <head>         
<title>Hello world as text</title> 
  </head> 
    <body>                 
        <?php                 
            echo "<p>Hello world</p>";                 
        ?>         
    </body> 
</html> 

更多细节请参考:https://stackhowto.com/how-to-combine-html-and-php/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接