在PHP中实现演示和业务逻辑的分离

6
我正在编写我的第一个真正的PHP网站,并想知道如何使我的代码更易读。我正在使用的参考书是《PHP和MySQL Web开发》第4版。
上述书籍提供了三种分离逻辑和内容的方法:
1.包含文件 2.函数或类API 3.模板系统
由于我需要一些时间来理解这些概念,所以我还没有选择其中任何一种方法。但是,我的代码已经成为了前两种方法的混合体,因为我只是在复制和修改。
在呈现方面,我的所有页面都有以下共同元素:页眉、顶部导航、侧边栏导航、内容、右侧边栏和页脚。
书中基于函数的示例表明,我可以有这些显示函数来处理所有的呈现示例。因此,我的页面代码将如下所示:
display_header();
display_navigation();
display_content();
display_footer();

然而,我不喜欢这样做,因为书中的示例将HTML和PHP混在一起使用,例如下面这样的打印语句:
echo "<tr bgcolor=\"".$color."\"><td><a href=\"".$url."\">" ...

我更喜欢在HTML中插入一些PHP,而不是相反。
我计划将页面设计为在页面开头从数据库中获取所有数据并将其放入数组中。我还会获取变量的数据。如果这些过程中有任何错误,我将把它们放入错误字符串中。
然后,在HTML代码中,我将使用foreach循环遍历这些数组并显示内容。在某些情况下,将显示一些变量。如果设置了错误变量,我将在适当的位置显示它。
(顺带一提:我不明白的是,在大多数示例代码中,如果某个数据库查询或其他操作出现错误,总会出现以下内容:)
else echo 'Error';

这让我感到困惑,因为当示例代码出错时,有时会在HTML开始之前就被输出...)
对于使用过ASP.NET的人来说,我已经习惯了code-behind文件和lblError,现在我正在尝试做类似的事情。
我还没想明白如何做到“先处理逻辑,再呈现内容”,这样我就不必在所有页面中复制导航逻辑和导航呈现了。
我应该做一些包含文件,还是可以在这里使用函数,但稍微有些不同?是否有任何好的文章能更详细地解释这些分离呈现和逻辑的“风格”?我手头的书只有一段话涉及到这些东西。
我的想法是,我在谈论PHP编程的一些概念或方法,但我还不知道它们的术语。
我知道这不是一个直截了当的问题,我只需要帮助组织我的思路。

好在没有人提到heredocs。由于某种原因,每当有关于分离逻辑和表现的问题时,总会有人提到heredocs,并且它会获得大量的赞。 - Lotus Notes
3个回答

4
永远不要在 PHP 中输出 HTML。相反,应该将其作为内联代码(不要使用邪恶的短标签)编写,如下所示: <tr class="<?php echo $myclass; ?>"> 其他帮助分离逻辑/视图的选项是使用像 CodeIgniter 这样的 PHP 框架。
我建议放弃这本书,而是专注于学习核心 PHP 技能,如函数、类等,然后开始尝试使用 几个流行的框架

另外一点:我不理解的是,在大多数示例代码中,如果某些数据库查询或其他操作出现错误,总会有:

这是因为它们将错误显示出来的方式不正确。你应该将错误存储在会话中,然后在页面上显示它们(同时清除它们),或者使用 error_log 函数将它们记录到错误日志中。 error_log("Something happened in MyClass");

我还没有想明白的是如何实现“先处理逻辑,再进行呈现”这一点,以便我不必在所有页面中复制导航逻辑和导航呈现。

MVC 的方式考虑。首先调用控制器(逻辑),它确定所需内容。如果需要从数据库获取数据,则调用模型并请求数据。然后格式化、添加其他数据、运行其他查询,最后将其传递给视图。


1
非常感谢有关错误和回显方面的输入。我一直在查看CodeIgniter页面,我喜欢MVC的想法,但它对我来说还有点难以理解。这就是为什么我希望找到一种明智地只使用PHP完成任务的方法。 - Markus Ossi
1
@Markus:然后在页面顶部使用includes。如果一个页面有逻辑(表单输入,数据库操作等),那么尽量将所有逻辑都放在一个页面中,并使用 $_SESSION 以及重定向来提供可视化流程。 - Josh K

1

听起来你正在寻找模板引擎 - 向谷歌询问会得到很多结果。个人而言,我非常喜欢smarty

(把那本书扔掉吧,听起来它太老了)


哦,是的。现在我看着我的问题并查看了Smarty,它似乎非常类似我所考虑的方式来做事情。但是,我想知道是否需要使用Smarty,还是可以按照“Smarty”的方式处理事情。 - Markus Ossi

1

MVC(模型视图控制器)听起来可能适合您的需求。您可以在这里阅读相关内容。


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