我对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)
这样的类中,但现在它看起来并不整洁。
现在我发现全局连接和持久连接,但有些人不推荐它们。
编写用户类的最佳方法是什么?
答案 0 :(得分:0)
我认为最好的方法是在需要它的页面中创建数据库连接,然后将其作为变量传递给用户类的构造函数以供其使用。我知道你已经尝试过了,但这是最好的方法。
示例:
的index.php
$dbs = new SafeMySQL();
$user = new User($dbs, 1);
user.php的
class User {
function __construct($dbs, $user_id){
$this->dbs = $dbs;
$this->user = $this->dbs->getRow('SELECT * FROM users WHERE id = ?i',$user_id);
}
}
答案 1 :(得分:0)
你在构造函数参数中包含连接的想法是我认为很好的。这个概念被称为“依赖注入”。依赖注入的目的是将您的DBMS与应用程序逻辑分离,这样如果有一天您决定不使用SafeMySQL,您可以在不更改User类的情况下传入不同的连接(您需要在SafeMySQL周围编写一个接口)要完成那个的课程)。在这种情况下,它具有额外的好处,可以让您管理与独立于应用程序逻辑的DBMS的连接。