在PHP中调用另一个类中的类

时间:2010-10-02 17:19:09

标签: php oop

希望你能帮助我解决这个问题:我有两个类:数据库和用户。数据库使用PDO(在构造函数内)连接到数据库,并具有更改表,插入数据等的功能.Users类将处理登录,以及添加/删除用户。但是,Users类需要连接到数据库。我怎样才能做到这一点?

5 个答案:

答案 0 :(得分:10)

你可以做几件事:

全局

$db = new Database();

class Users
{
  public function foo()
  {
    global $db;
    $db->query();
  }
}

设置静态变量

$db = new Database();

class Model
{
  static public $db;
}

Model::$db = $db;

class Users extends Model
{
  public function foo()
  {
    self::$db->query();
  }
}

使用单身

class Database
{
   private static $instance;

   private function __construct()
   {
   }

   public static function instance()
   {
      return self::$instance ? self::$instance : self::$instance = new self();
   }
}

class Users
{
   public function foo()
   {
      Database::instance()->query();
      // or $db = Database::instance(); $db->query();
   }
}

您要避免的一件事是为每个模型或类创建一个新的数据库连接。

答案 1 :(得分:1)

只需将对数据库类实例的引用添加到Users:

class Users  {
  var $database;
  function __construct()  {
    $this->database = new Database();
  }
};

或者,如果Database是单例,只需直接引用它。

答案 2 :(得分:1)

与通常情况相同,但可能有助于使数据库成为类属性:

<?php
class Users
{

    protected $_db;

    public function __construct(Database $database = null)
    {
        if (!$database) {
            $database = new Database;
        }
        $this->_db = $database;
    }

    public function addUser($username)
    {
        // Do stuff ...
        $this->_db->insert($data);
    }

}

然后您可以使用User类,如:

<?php
$users = new Users;
$users->addUser('joebob');

答案 3 :(得分:1)

这样做的一种方法是创建数据库类的ONE共享实例,然后在需要的地方将其用作全局变量。

首先在项目的任何位置创建实例,只需确保它位于全局空间(不在另一个类或函数内)。

$DB = new Database();

然后要访问共享数据库对象,只需使用$ GLOBALS内置数组:

class User {
  function __construct() {
    $DB = &$GLOBALS['DB'];
    // do something
    $DB->callSomeMethod();
  }
  ...
}

正如@Ryan所指出的,使用此策略可以实现名称空间冲突。最好的中间路径是将Database类转换为单例。然后它将存储自己的实例(翻译:无论什么连接),可以通过Database :: getInstance()方法访问。

答案 4 :(得分:0)

这是我的用户类:

class Users {

    private $data;
    private $db;

    public function __construct() {
        $db = Database::getInstance('localhost', 'database', 'root', '123456');
    }

    public function __get($key) {
        return $this->data[$key];
    }

    public function __set($key, $value) {
        $this->data[$key] = $value;
    }

    public function test() {

        foreach($this->db->query('table', '*', '', '', '', '', '0,5') as $value) {
            $results .= $value['field1'] . "<br />";
        }

        return $results;
    }
}