关于数据库连接存储的一些小问题

weepinsilence 2009-08-18 10:11:30
各位大大好,

我最近在做个PHP的网站,为了能够让系统的结构看上去更加清晰,我打算尝试引入OO的编程方式(之前都是清一色的function -_-)。但是在处理数据库连接方面,有些小问题。

例如我有个“用户”的类,class user。构建器默认是接收一个用户的ID,然后从数据库中读取用户的各项资料,然后保存在私有的属性内,大概看起来是这么个东东:


class user{
private $username;
private $avatar;
private %blablabla;

public function __construct($_username){
// 就是在这里开始读取数据库,然后赋值
}
}


接下来问题就来鸟,那user类怎么操作数据库呢?是把之前打开的数据库连接的变量传递给构建器么?例如:


public function __construct(&$database, $username){ /* ___ bla bla bla ___ */ }


我之前在网上看到,使用static变量来创建一个数据库的class,然后保证同时只有一个数据库连接被打开。

但是因为不同的类是保存在不同的文件里面的,现在要把他们放在一起用,有点搞不明白。例如我现在这个user的类,需要用到数据库操作。那怎么把数据库连接提供给他呢?

之前想过存在global里面,但是觉得还是有点不靠谱。所以来问问大家平时都是怎么操作的呢?
...全文
89 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
fenyao 2009-08-19
  • 打赏
  • 举报
回复
8楼方法很不错,数据库始终只有一个instance
babysc1 2009-08-19
  • 打赏
  • 举报
回复
楼上的方法就是本人的最爱 也就是USER类~

public function __construct($_username){
// 读取数据库,赋值
$this->db = application::getInstance('db');
foolbirdflyfirst 2009-08-19
  • 打赏
  • 举报
回复
这个是设计问题,static实现singletone模式是常用技巧,你的类名和文件夹名之间要有某种规划关联的关系。
//这个例子里的application类,db 类,应该放在不同文件夹,比如application/application.class.php,includes/db/db.class.php,这样你知道db这个关键字参数,就知道到哪个目录去找哪个文件。
class user{
private $username;
private $avatar;
private $blablabla;

public function __construct($_username){
// 就是在这里开始读取数据库,然后赋值
$this->db = application::getInstance('db');
echo $this->db."<br/>";
}
}

class application{
public static function getInstance($instance)
{
static $instances;
if(!$instances[$instance])
{
$instances[$instance] = new $instance();
}
return $instances[$instance];
}
}
$config['host'] = 'localhost';
$config['db_user'] = 'root';
$config['db_pass'] = '';
class db
{
public function __construct()
{
global $config;
$this->conn = mysql_connect($config['host'],$config['db_user'],$config['db_pass']);
}
}

  • 打赏
  • 举报
回复
你可以自己封装一个数据库类啊,或者直接mysql_connect也行啊
xuzuning 2009-08-19
  • 打赏
  • 举报
回复
可能的方案是多种多样的,这就是编程的魅力所在

在一个类中创建另一个类的实例,这是最基本的做法,不过没有跳出传统的函数型语言的编程框框

将数据库类作为基类,凡是需要使用数据库的类都从基类派生。这是面向对象编程的核心

将需求交由控制中心调度完成,这是所有基于mvc的框架的核心

我一般喜欢使用信使传递需求,这样可以方便的接入不同风格、不同语言的功能模块。只是给他配个信使接口就可以了
weepinsilence 2009-08-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 cunningboy 的回复:]
如果还有其他类用到数据库,将数据库类对象放在公用的地方,然后user类的实例作为参数传递给数据库连接或者接收数据库的查询结果。
[/Quote]

肯定还有别的类要用到数据库连接的。

不过你说的这个方法很不错,数据库类直接负责创建user等等,例如:

$user = $db->getUser($username);


这样至少在user类内部不需要关心数据库的问题了。
CunningBoy 2009-08-18
  • 打赏
  • 举报
回复
如果你数据库连接只有user类用的话,就在user类的里面创建数据库类对象。
如果还有其他类用到数据库,将数据库类对象放在公用的地方,然后user类的实例作为参数传递给数据库连接或者接收数据库的查询结果。
dzxccsu 2009-08-18
  • 打赏
  • 举报
回复
类好象可以调用其他类的static方法

class db{
private $host;
private $root;
private $psw;
function __construct($host,$root,$psw){

}
static function link(){

}

}

//另一个类
class user{
private $username;
private $avatar;
private %blablabla;

public function __construct($_username){
$db=db::link();//这里调用
}

}
weepinsilence 2009-08-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhoupuyue 的回复:]
在user类里面创建一个数据库类的对象啊!
[/Quote]

恩恩恩,也就是说直接在user类里面使用数据库类咯,在require_once我的user类之前,得先把数据库类包含进来的……
阿_布 2009-08-18
  • 打赏
  • 举报
回复
在user类里面创建一个数据库类的对象啊!

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧