繁体   English   中英

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

[英]Calling a class inside another one in PHP

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

你可以做几件事:

全局

$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();
   }
}

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

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

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

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

您通常会采用相同的方式,但它可能有助于使数据库成为类属性:

<?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');

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

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

$DB = new Database();

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

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

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

这是我的Users类:

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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM