【问题标题】:PHP conventions for encapsulation and database calls用于封装和数据库调用的 PHP 约定
【发布时间】: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


【解决方案1】:

我在my MVC framework 中所做的是创建一个数据库连接并将其分配给Model 基类(在配置中):

$db = new database\adapters\MySQL(...);
if ( !$db->connected() ) {
  exit('Ewps!');
}

database\Model::dbObject($db);

以后,我可以在任何地方使用:

User::getFriends(13);

因为User extends ModelModel 可以访问$dbself::dbObject()

如果我需要原始数据库连接,我可以使用Model::dbObject()$GLOBALS['db'],但我很少需要原始连接,因为所有数据库逻辑都应该在您的模型中。

【讨论】:

  • 我相信这绝对是要走的路。作为一个小测试,我现在已经这样做了大约 4-5 个小时,感觉好多了。谢谢!
【解决方案2】:

查看Singleton Pattern。它允许您创建一个类(一个 DB 对象),但只允许其中一个(因此不能实例化多个)。

这意味着您只需创建一个到数据库的连接并且它是共享的。

查看here 获取代码示例

【讨论】:

  • 请不要使用单例。您可以使用像 instance 这样的静态方法来获取实例,但永远不要让您的构造函数受保护/公开,因为您以后可能需要更多它们(数据库连接)。
  • 显然我的意思是:“但永远不要让你的构造函数受保护/private
猜你喜欢
  • 2012-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多