静态方法与静态实例

时间:2012-11-25 06:47:30

标签: php mysql oop mysqli

请考虑下面的代码,我已经被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();

?>

3 个答案:

答案 0 :(得分: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个连接,你不应该!使用单身人士。

答案 1 :(得分: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();

我认为这应该清除为什么使用静态实例变量的混淆。

如果这不是一个单身人士,那么你的“为什么他们不使用静态方法”的问题应该得到“他们应该有”的答案。

答案 2 :(得分:0)

为了澄清,$db是一个Database对象,通过调用静态方法getInstance()来实例化。

  

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

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

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