9

I learned PHP by hacking away at phpBB2, even submitting a few mods to their database, which others downloaded and used. (I don't believe phpBB2 is supported any more with phpBB3 out so long now, so the v2 mods database is no more.)

One of my favorite things about phpBB was their templates system, which let the editor completely separate the HTML and the PHP. PHP files contained PHP: logic, database queries, and activating the templates. TPL files contained templates: HTML, template variables, and specialized HTML comments to allow for conditional or repeating blocks.

However, any time I see someone's PHP code online, it's either a small snippet working with a single function or such, or the PHP is full of strings containing HTML (or worse, HTML with PHP interspersed). phpBB is the only PHP I've looked at which actually separates the language and the markup language, suggesting to me that few, if any, other PHP codebases do such a thing.

I'm looking to start working with some PHP again, but this time it won't be a phpBB forum, and it will be on a team. Based on my experience, separation of PHP and HTML is uncommon (please correct me if I'm wrong on this!). However, I'm so used to that dividing line, I hate reading mixed PHP and HTML.

In the "real world" of PHP programming, what's the preferred method:

  • PHP files with strings of HTML
  • HTML files broken up with PHP blocks
  • PHP and HTML completely separate (I wish?)
  • Something else?
4

9 回答 9

7

如果您想将 PHP 与 HTML 分开,您可以使用模板引擎(如 smarty http://www.smarty.net/)。

于 2010-07-10T20:06:14.613 回答
5

就个人而言,当 PHP 已经是一个非常好的解决方案时,我认为没有理由将模板系统/语言添加到组合中。

我首选的方法是将显示与应用程序的逻辑分开。这可以采用成熟的 MVC 框架的形式。但是,这也可能是您如何编写代码的简单问题。

扩张:

自从犯了用大量 ASP 代码散布我的 HTML 的错误以来,我一直试图将页面逻辑与显示分开。在单个页面中,这意味着将所有页面逻辑放在顶部,将要显示的信息存储在变量中,然后在 PHP 文件底部的 HTML 中回显它们。HTML 部分中出现的唯一逻辑是显示逻辑。换句话说,简单的错误处理、ifs、循环等。基本上,你会在大多数模板语言中找到相同的东西。

我避免使用模板语言的原因是它是我需要担心的另一种语法形式。重点是什么?PHP 为这个目的提供了比我需要的更多的东西。

同时,您可以通过分离事物来采用简单的 MVC 方法:

控制器.php

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

include 'view.php';

exit;
?>

视图.php:

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

echo $data['message'];

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

这并非没有缺点和问题。但是,如果您认为可以在应用程序逻辑和显示之间实现完全、清晰的分离,那您就错了。

于 2010-07-10T23:24:32.280 回答
4

我们为 MVC 使用定制的代码点火器基础,只是将逻辑和布局分开。这并不一定意味着我们的 html 中没有 php,只是它不用于逻辑。在模板 imho 中循环使用 php 代码的记录集是完全可以的,只是不要尝试与业务对象交谈,而实际上在布局模板中做一些事情。如果您真的想摆脱那里的所有 php 代码,您当然也可以查看类似tal或其他一百万个模板的内容。我有点认为这主要是矫枉过正,除非“在这里插入特殊情况”

编辑固定错字

于 2010-07-10T20:07:33.547 回答
3

以我的经验,很多 PHP 开发,无论是好是坏,最终都是通过包含打印出所需的 HTML 片段的 php 文件相互连接。

不过请注意,我的大部分 PHP 经验更多的是“我们只需要有效的解决方案”而不是“我们需要最优雅和最有效的解决方案”

于 2010-07-10T20:06:36.373 回答
3

每当我在网上看到某人的 PHP 代码时,它要么是一个使用单个函数或类似函数的小片段,要么是 PHP 充满了包含 HTML 的字符串(或者更糟糕的是,散布着 PHP 的 HTML)。

是的,那里的一般代码质量令人尴尬。

虽然您可以使用自己的成熟模板引擎,但这可能有点矫枉过正,而且在许多情况下,当您可能只是在 PHP 中编写表示逻辑时,它们提供的有限的特定领域语言会妨碍您。

如果您仍然想编写普通的 PHP,但没有意大利面条:

  1. 将操作代码保留在文件顶部或其他文件中。仅将应用程序逻辑放在这里,而不是任何类型的 HTML 或模板。在这个阶段生成的任何需要模板显示的信息都需要放入一个变量中传递给模板部分,而不是 print在加载业务逻辑的过程中被淘汰。

  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 编程的现实世界中,一般的项目都会不假思索地将各种方法混杂在一起。在现实世界中,代码不可维护、漏洞百出且不安全。您不想查看行业标准,因为行业标准将在各个方面被打破。

于 2010-07-10T22:04:02.773 回答
2

Based on my experience, separation of PHP and HTML is uncommon

True. But lot of PHP code is written by inexperienced developers. Further, PHP does not encourage, but rather discourage writing good code, and the ability to mix HTML with programming code is one of the examples of this.

If you expect to do high quality code, to be able to easily maintain and extend it, I highly recommend using template engine or something similar. Mixing both has a huge impact on the readability of your code, and will result in something becoming worse and worse over time. Refactoring will be painful, if not impossible.

Now, you have a large choice of the way to separate HTML from PHP

  • The most obvious one is to use an existing layout engine. There are plenty of them, some very well done and with a very low performance impact.

  • You can also write your own engine. It may not be a good idea on a big project (why reinvent the wheel?), but can be a solution either on a tiny project or when you need something very specific.

  • The last way I use in most projects is to build XML from business layer (XML serialization is quite easy in PHP), then to use XSLT to transform this to HTML page. It enables to do websites which are much easier to maintain and more easy to understand, and, by the way, enables to access the website data programmatically (loading XML instead of HTML page) when need. On the other hand, it decreases performance hugely, so is not intended for large websites with thousands of queries per second.

于 2010-07-10T20:20:10.147 回答
2

我更喜欢使用模板系统来最小化 HTML 文件中包含的 PHP 代码量。我真的看不到任何将 PHP 与 HTML 完全分开的方法,但我觉得将业务逻辑(数据库)与表示逻辑分开就足够了。

我的模板系统是自制的,但我相信您可以通过执行 google 搜索找到各种可行的方法。

于 2010-07-10T20:06:53.177 回答
0

大多数代码以 PHP 和 HTML 字符串开头,然后在大重写期间演变为模板系统。预先将内容与逻辑分开需要团队之间的设计、规划和沟通。使用 XML 或 JSON 代替 PHP 数组作为数据格式使这更容易。

于 2013-03-04T20:28:20.307 回答
0

您可以在 HTML 中混合 PHP,反之亦然,只需在 HTML 之间添加打开<?php和关闭?>PHP 标记即可。

<!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/

于 2020-12-04T21:26:41.720 回答