1

我对 OOP 比较陌生,现在正在尝试使我的网站适应 githibs 的 Safemysql https://github.com/colshrapnel/safemysql

在继续编写更多基于 OOP 的代码之前,我遇到了一个必须解决的谜题。

在我的网站上,我有一个管理部分,我可以在其中查询数据库用户的不同列表。我对 User 类的第一次尝试是

class User {
    function __construct($user_id) {
        $this->dbs  = new SafeMySQL(); 
        $this->user = $this->dbs->getRow('SELECT * FROM users WHERE id = ?i', $user_id);
    }
    function get_something_else() { }
    function calculate_this() { }
}

foreach (array as $user_id) {
    $user = new User($user_id);
}    

使用第一种方法告诉我,如果我有一页包含数百个结果,我将创建尽可能多的连接,因此我想到了另外两种使用我的用户类的方法:

class User {
    function __construct() {
        $this->dbs = new SafeMySQL(); 
    }
    function load_user($user_id) {
        $this->user = $this->dbs->getRow('SELECT * FROM users WHERE id = ?i',$user_id);
        $return $this->user
    }
    function get_something_else() { }
    function calculate_this() { }
}

$data = new User();

foreach (array as $user_id) {
    $user = data->load_user($user_id);
}

我使用这个类没有问题,但我一直认为我会错误地定义一个变量,该变量将为另一个用户保留。

我想到的另一种选择是定义我的连接,然后将它用于这样的类, $user = new User($user_id, $connection)但现在它看起来并不整洁。

现在我了解了全局连接和持久连接,但有些人不推荐它们。

编写我的用户类的最佳方式是什么?

4

2 回答 2

0

我认为最好的方法是在需要它的页面中创建一个数据库连接,然后将其作为变量传递给用户类的构造函数供其使用。我知道你已经尝试过了,但这是最好的方法。

例子:

索引.php

$dbs = new SafeMySQL();
$user = new User($dbs, 1);

用户.php

class User {
      function __construct($dbs, $user_id){
          $this->dbs = $dbs;
          $this->user = $this->dbs->getRow('SELECT * FROM users WHERE id = ?i',$user_id);
       }
}
于 2013-05-30T22:36:13.150 回答
0

我认为您将连接包含在构造函数参数中的想法是一个很好的想法。这个概念被称为“依赖注入”。依赖注入的目的是将您的 DBMS 与您的应用程序逻辑分离,因此如果有一天您决定不使用 SafeMySQL,您可以传入不同的连接而不更改您的 User 类(您需要围绕 SafeMySQL 编写一个接口类来实现这一点)。在这种情况下,它还有一个额外的好处,就是让您可以独立于应用程序逻辑来管理与 DBMS 的连接。

于 2013-05-31T20:30:19.137 回答