關閉它沒有壞處,我想知道,如果創建一個類像下面的人會是一個很好的做法。
我認爲這不是一個好習慣。特別是有一個原因:你描述了你認爲需要它的原因:每個請求只有一個連接。
你不需要編碼任何東西。 mysqli
內置了一個很好的功能,默認連接。它採用主從INI設置數據庫連接參數(配置)每次創建新實例時間:
$db = new mysqli;
當腳本完成所有數據庫連接關閉掉,沒有太多的關心都沒有。你需要做的唯一事情就是實例化連接一次,並將變量傳遞給需要該對象的所有代碼。
另一個不好的做法是,你引入SingletonDoc這裏,是這樣的:
class MysqliSingleton extends mysqli
{
private static $instance;
/**
* @return MysqliSingleton
*/
public function getInstance()
{
if (NULL === self::$instance)
self::$instance = new self();
return self::$instance;
}
private function __construct()
{
}
public function __clone()
{
throw new RuntimeException('Clone is not allowed.');
}
public function __wakeup()
{
throw new RuntimeException('Unserializing is not allowed.');
}
}
它的工作是這樣的:
$mysqli = MysqliSingleton::getInstance();
,並會始終返回一個mysqli的實例,該實例可能是你在找什麼。然而單身人士被認爲是有害的,因爲他們可以引入很多問題,請參閱相關問題Who needs singletons?。
讓您自己創建一個您傳遞的包含數據庫實例的變量會更容易。您還可以封裝某種惰性加載,以防您的應用程序不總需要mysqli連接,例如有一個很簡單的上下文類:
interface ContextMysqli
{
/**
* @return mysqli
*/
public function getMysqli();
}
class Context implements ContextMysqli
{
private $mysqli;
public function getMysqli()
{
$this->mysqli || $this->mysqli = new mysqli();
return $this->mysqli;
}
}
當你的腳本開始,只是實例化你的背景和它傳遞給你的代碼的每一個部分,你需要它:
$context = new Context();
...
$result = do_some_db_work($context);
...
function do_some_db_work(ContextMysqli $context)
{
$mysqli = $context->getMysqli();
...
}
這個建議可能是有點目光短淺,但它比單身人士好,而不會引入太多東西。好處是你已經封裝了邏輯何時創建不需要單例的mysqli
對象。您的代碼現在獨立於全局或靜態上下文。