请考虑下面的代码,我已经被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();
?>
答案 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类添加方法以与数据库进行交互。