各位大大好,我最近在做个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里面,但是觉得还是有点不靠谱。所以来问问大家平时都是怎么操作的呢?

解决方案 »

  1.   

    在user类里面创建一个数据库类的对象啊!
      

  2.   


    恩恩恩,也就是说直接在user类里面使用数据库类咯,在require_once我的user类之前,得先把数据库类包含进来的……
      

  3.   

    类好象可以调用其他类的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();//这里调用
        }}
      

  4.   

    如果你数据库连接只有user类用的话,就在user类的里面创建数据库类对象。
    如果还有其他类用到数据库,将数据库类对象放在公用的地方,然后user类的实例作为参数传递给数据库连接或者接收数据库的查询结果。
      

  5.   


    肯定还有别的类要用到数据库连接的。不过你说的这个方法很不错,数据库类直接负责创建user等等,例如:$user = $db->getUser($username);
    这样至少在user类内部不需要关心数据库的问题了。
      

  6.   

    可能的方案是多种多样的,这就是编程的魅力所在在一个类中创建另一个类的实例,这是最基本的做法,不过没有跳出传统的函数型语言的编程框框将数据库类作为基类,凡是需要使用数据库的类都从基类派生。这是面向对象编程的核心将需求交由控制中心调度完成,这是所有基于mvc的框架的核心我一般喜欢使用信使传递需求,这样可以方便的接入不同风格、不同语言的功能模块。只是给他配个信使接口就可以了
      

  7.   

    你可以自己封装一个数据库类啊,或者直接mysql_connect也行啊
      

  8.   

    这个是设计问题,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']);
    }
    }
      

  9.   

    楼上的方法就是本人的最爱 也就是USER类~public function __construct($_username){
        // 读取数据库,赋值
            $this->db = application::getInstance('db');
      

  10.   

    8楼方法很不错,数据库始终只有一个instance