【问题标题】:Preferred way to combine PHP and HTML?结合 PHP 和 HTML 的首选方式?
【发布时间】:2010-07-10 20:01:08
【问题描述】:

我通过破解phpBB2 学习了PHP,甚至向他们的数据库提交了一些模组,其他人下载并使用了这些模组。 (我不相信 phpBB2 已经不再支持 phpBB3 这么久了,所以 v2 mods 数据库已经不复存在了。)

我最喜欢 phpBB 的一个地方是他们的模板系统,它让编辑器将 HTML 和 PHP 完全分开。 PHP 文件包含 PHP:逻辑、数据库查询和激活模板。 TPL 文件包含模板:HTML、模板变量和专门的 HTML cmets,以允许条件或重复块。

但是,每当我在网上看到某人的 PHP 代码时,要么是一个小型 sn-p 使用单个函数等,要么 PHP 充满了包含 HTML 的字符串(或者更糟糕的是,穿插有 PHP 的 HTML)。 phpBB 是我见过的唯一一个真正将语言和标记语言分开的 PHP,这表明很少有其他 PHP 代码库会做这样的事情。

我希望再次开始使用 PHP,但这次不是 phpBB 论坛,而是在一个团队中。 根据我的经验,PHP 和 HTML 的分离并不常见(如果我错了,请纠正我!)。但是,我已经习惯了那个分界线,我讨厌混合阅读 PHP 和 HTML。

在 PHP 编程的“现实世界”中,首选的方法是什么:

  • 带有 HTML 字符串的 PHP 文件
  • 用 PHP 块分解的 HTML 文件
  • PHP 和 HTML 完全分开(我希望?)
  • 还有别的吗?

【问题讨论】:

    标签: php html templates separation-of-concerns


    【解决方案1】:

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

    【讨论】:

    • 我认为这正是我正在寻找在 PHP 中开发而不捎带 phpBB 的那种东西。
    【解决方案2】:

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

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

    扩展:

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

    我避免使用模板语言的原因是它是我需要担心的另一种语法形式。重点是什么? 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>
    

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

    【讨论】:

    • 你能扩展一下吗? PHP 究竟如何成为分离 PHP 和 HTML 的解决方案?那么你的 MVC 方法的例子呢?我了解 MVC 的概念,但我的周末大脑(只打开了一半!)没有 PHP MVC 用于分离逻辑和表示的概念。
    • 感谢您的扩展答案。您的推荐与bobince的推荐似乎相似?
    • @bobince 是的,差不多。我回答的动机是警告不要使用模板系统。在某些情况下它们可能有用。比如说,如果你有一个单独的团队专门负责前端。但是,如果您了解 PHP 并且您负责 HTML(或者后端开发人员必须经常接触它),我认为模板系统通常是矫枉过正的。良好的编码实践无需额外的处理层即可实现相同的目标。
    • 好的,我明白了。我提出这个问题的动机主要是因为我已经习惯了 phpBB 的模板,以至于我根本不喜欢阅读混合了 PHP 和 HTML 的文件。不过,我想我可以处理这种程度的混合;我认为我习惯的和你的 MVC 示例之间唯一的显着区别是表示逻辑,如果表示逻辑开始变得特别复杂,这条路线甚至会更好(至少优于 phpBB2)。
    • @Brian S 注意,如果您删除包含和退出的调用,这可以在一个文件中完成。这是我通常用于相对简单的页面的方法。
    【解决方案3】:

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

    编辑修正错字

    【讨论】:

      【解决方案4】:

      根据我的经验,很多 PHP 开发,无论是好是坏,最终都是通过包含根据需要打印出 HTML 的 sn-ps 的 php 文件相互连接。

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

      【讨论】:

      • 这很有意义,它解释了我看到的所有我讨厌看的代码。
      【解决方案5】:

      每当我在网上看到某人的 PHP 代码时,要么是一个小型 sn-p 使用单个函数或类似的功能,要么 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 编程的现实世界中,一般的项目都会不假思索地将各种方法拼凑在一起。在现实世界中,代码不可维护、漏洞百出且不安全。你不想看行业标准,因为行业标准会在各个方面被打破。

      【讨论】:

      • 你能给我指出一个以这种方式格式化的重要项目的源代码吗?我喜欢这个概念,但我想看看它在更大范围内的可读性如何,以及如何处理许多特定情况。
      • 不,我不能。我还没有遇到过一个公开的 PHP 项目,它的模板不是曲折的小 echo-HTML 的迷宫,都一样。
      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

        根据我的经验,PHP 和 HTML 的分离并不常见

        没错。但是很多 PHP 代码是由没有经验的开发人员编写的。此外,PHP 不鼓励而是不鼓励编写好的代码,将 HTML 与编程代码混合的能力就是其中的一个例子。

        如果您希望编写高质量的代码,以便能够轻松维护和扩展它,我强烈建议您使用模板引擎或类似的东西。将两者混合会对代码的可读性产生巨大影响,并且随着时间的推移会导致事情变得越来越糟。重构将是痛苦的,如果不是不可能的话。

        现在,您可以选择多种方式将 HTML 与 PHP 分开

        • 最明显的一种是使用现有的布局引擎。它们有很多,有些做得很好,但对性能的影响非常低。

        • 您也可以编写自己的引擎。对于大型项目,这可能不是一个好主意(为什么要重新发明轮子?),但对于小型项目或当您需要非常具体的东西时,它可能是一个解决方案。

        • 我在大多数项目中使用的最后一种方法是从业务层构建 XML(XML 序列化在 PHP 中非常容易),然后使用 XSLT 将其转换为 HTML 页面。它可以让网站更容易维护和更容易理解,顺便说一句,可以在需要时以编程方式访问网站数据(加载 XML 页面而不是 HTML 页面)。另一方面,它会极大地降低性能,因此不适用于每秒有数千个查询的大型网站。

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

            您可以在 HTML 中混合 PHP,反之亦然,只需在 HTML 之间添加打开 &lt;?php 和关闭 ?&gt; 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/

            【讨论】:

              猜你喜欢
              • 2012-09-27
              • 1970-01-01
              • 2019-12-29
              • 2013-01-05
              • 2012-11-27
              • 1970-01-01
              • 2010-11-26
              • 1970-01-01
              相关资源
              最近更新 更多