封装和数据库调用的PHP约定

封装和数据库调用的PHP约定,php,database,model-view-controller,mysqli,encapsulation,Php,Database,Model View Controller,Mysqli,Encapsulation,这需要一点时间来解释。我正在创建我的第一个真实世界的web应用程序,我希望能够正确地完成它。我几乎没有PHP经验,但在其他语言方面有丰富的经验,所以技术技能不是问题,而是语言的更多约定。我正在遵循MVC模式,我正处于为应用程序实现用户注册的阶段 为了标准化与数据库的连接,我使用静态getConnection方法创建了一个Config类,该方法创建了一个mysqli连接对象。这不是问题,这是下一个问题 为了使我的类更具可读性,我在其中内置了各种函数来进行数据库调用。例如,我的用户类有一个getFr

这需要一点时间来解释。我正在创建我的第一个真实世界的web应用程序,我希望能够正确地完成它。我几乎没有PHP经验,但在其他语言方面有丰富的经验,所以技术技能不是问题,而是语言的更多约定。我正在遵循MVC模式,我正处于为应用程序实现用户注册的阶段

为了标准化与数据库的连接,我使用静态getConnection方法创建了一个Config类,该方法创建了一个mysqli连接对象。这不是问题,这是下一个问题

为了使我的类更具可读性,我在其中内置了各种函数来进行数据库调用。例如,我的用户类有一个getFriends方法,如下所示:

class User
{
   public $id;

   public getFriends()
   {
      return UserController::getFriends($id);
   }
}
但现在,如果我以这种方式实现它,就意味着为页面上的每个查询创建一个连接,可能在一个脚本中多次创建,这太可怕了

我正考虑做与上面相同的事情,但向getFriends传递一个mysqli对象,这反过来又会将一个对象传递给UserController::getFriends,但这感觉很混乱,坦率地说是糟糕的形式,尽管它可以保证每个脚本只有一个连接,这是一个更好的改进

我还考虑放弃将方法完全保存在User中的想法,而是直接在脚本中调用UserController::getFriends($connection,$id),在开始时声明一个$connection,以代替User->getFriends()。这似乎是最干净、最好的解决方案,但我不确定

那么,从本质上讲,PHP人员通常是如何做这类事情的呢。它允许您创建一个类(DB对象),但只允许其中一个(因此不能实例化多个)

这意味着您只需要创建一个到DB的连接,并且它是共享的

检查代码示例

我在中所做的是创建一个db连接并将其分配给
模型
基类(在配置中):

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

User::getFriends(13);
因为
用户扩展了Model
并且
Model
可以访问
$db
self::dbObject()

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


非常奇怪的是,您的
型号
用户
)调用您的
控制器
用户控制器
)来获取信息。。。MVC通常是另一种方式=)延迟加载是一个很好的发明。对于几乎所有组件。不适用于数据库连接!99%的应用程序在每次请求时都需要数据库,因此延迟加载只会使其速度变慢。(您可以将连接存储在
DbWrapper::$connection
或其他东西中。或者只存储
$GLOBALS['$db']
。GLOBALS不是邪恶的。)我同意!真奇怪。我认为我最后的方法似乎很合适。也就是说,调用UsReals::GETFALSE($连接,$ID),并取消GETTER方法的想法,使数据库调用完全。而且,我确实考虑了全局,但是由于其他语言的冲突,我自然会回避它们,这是令人伤心的。我确实喜欢PHP处理全局的方法,所以我也很乐意考虑全局方法。请不要使用SuntLon。你可以使用一个静态方法,比如
instance
,来获取一个实例,但是永远不要让你的构造函数受保护/公开,因为你以后可能会需要更多的构造函数(数据库连接)。很明显,我的意思是:“但是永远不要让你的构造函数受保护/私有”。我相信这绝对是正确的方法。我已经做了大约4-5个小时的测试,感觉好多了。谢谢
User::getFriends(13);