【发布时间】:2011-04-24 12:51:49
【问题描述】:
这需要一点时间来解释。我正在创建我的第一个真实世界的 Web 应用程序,并且我会正确地完成它。我的 PHP 经验很少,但在其他语言方面经验丰富,因此技术技能不是问题,而是更多的语言约定。我正在遵循 MVC 模式,并且正处于为应用程序实现用户注册的阶段。
为了标准化与数据库的连接,我创建了一个带有静态 getConnection 方法的 Config 类,该方法创建了一个 mysqli 连接对象。这不是问题,这是下一个问题。
为了使我的类更具可读性,我在其中内置了各种函数来进行数据库调用。例如,我的 User 类有一个 getFriends 方法,如下所示:
class User
{
public $id;
public getFriends()
{
return UserController::getFriends($id);
}
}
但就目前而言,如果我以这种方式实现它,这意味着为页面上的每个查询创建一个连接,可能在一个脚本中很多次,这太可怕了。
我正在考虑做与上面相同的事情,但将 getFriends 传递给一个 mysqli 对象,该对象又将一个对象传递给 UserController::getFriends ,但这感觉很混乱,而且坦率地说形式很差,尽管它只能保证一个每个脚本的连接,一个更好的改进。
我还考虑过放弃将方法完全保留在 User 内部的想法,而是直接在脚本中进行像 UserController::getFriends($connection, $id) 这样的调用,并在开头声明一个 $connection,在user->getFriends() 的位置。这似乎是绝对最干净、最好的解决方案,但我不确定。
那么,本质上,PHP 人通常是如何做这种事情的?
【问题讨论】:
-
很奇怪,你的
Model(User) 调用你的Controller(UserController) 来获取信息... MVC 通常是相反的 =) -
延迟加载是一个很好的发明。适用于几乎所有组件。不适用于数据库连接! 99% 的应用程序每个请求都需要数据库,因此延迟加载它只会使其变慢。 (您可以将连接存储在
DbWrapper::$connection或其他东西中。或者只是$GLOBALS['$db']。全局不是邪恶的。) -
我同意!它很奇怪。我认为我的最终方法似乎很合适。也就是说,调用 UserController::getFriends($connection, $id) 并放弃完全调用数据库的 getter 方法的想法。
-
另外,我确实考虑过全局变量,但由于其他语言的冲突,我现在自然而然地回避它们,这很可悲。不过我确实喜欢 PHP 对全局变量的处理,所以我也很乐意考虑全局方法。
标签: php database model-view-controller mysqli encapsulation