2

考虑下面的代码,Lynda.com 一直认为我要创建这样的数据库类,我的问题是为什么不完全为数据库创建静态方法而不是将实例存储到静态属性中?

<?php
class Database {

  private $conn;
  private static $init;

  public function __construct() {
     $this->conn = new mysqli('localhost','root','root','mydb');
  }

  public static function getInstance() {
     self::$init = new self();
     return self::$init;
  }

}

$db = Database::getInstance();

?>
4

3 回答 3

2

如果你想使用单例,你应该保护 __construct()

class DB
{
  private static $instance;

  private function __construct($args)
  {
    // do some
  }

  public static function getInstance()
  {
    // get instance
  }
}

$query = 'SELECT etc...';
$stmt = DB::getInstance()->prepare($query);

我在 DB 类中使用这种模式。但是,如果您有超过 1 个连接,则不应该!使用单例。

于 2012-11-27T15:25:23.430 回答
1

我的猜测是您发布的代码旨在如下,因为它看起来像是一个单例。我只是改变了getInstance()方法。

class Database {

  private $conn;
  private static $init;

  public function __construct() {
     $this->conn = new mysqli('localhost','root','root','mydb');
  }

  public static function getInstance() {
     if (is_null(self::$init)) {
         self::$init = new self();
     }
     return self::$init;
  }

}

$db = Database::getInstance();

我认为这应该消除为什么使用静态实例变量的困惑。

如果这不是单例,那么“他们为什么不使用静态方法”的问题应该有“他们应该有”的答案。

于 2012-11-25T18:44:48.010 回答
0

澄清一下,$db是一个数据库对象,它是通过调用静态方法来实例化的getInstance()

为什么不完全为数据库创建一个静态方法?

静态方法是在类内部定义的,但是无需实例化类就可以调用它。换句话说,静态方法属于类,因为可以在不实例化对象的情况下调用 in。

您可以根据需要向 Database 类添加方法以与数据库交互。

于 2012-11-25T07:07:34.210 回答