我正在用mysqli做我的第一个PHP项目(直到今天我一直在使用mysql)。因为它非常简单,我不使用类,只是函数,我想知道何时以及如何实例化连接。即,我正在考虑这两种情况:
情景I:
$DBLink = new mysqli(...);
function foo($DBLink, $params, ...) {
//Stuff.
}
foo($DBLink, ...);
情景二:
function getConnection() {
$DBLink = new mysqli(...);
return $DBLink;
}
function foo($params,...) {
$DBLink = getConnection();
//Stuff
}
foo(...);
使用DBLink会有多个功能(实际上很多)。
两种情况中哪一种更好,为什么?我更喜欢第二个,它看起来更干净,但也许它只是一次实例化它是一个更好的主意。
答案 0 :(得分:1)
答案是第二种方法,尽管有更好的方法。
最好的选择是使用您可以从任何方法获得的单例类。一个不完整的例子是(这实际上不会自己工作,但是它可以让你知道像这样的单例内发生了什么);
class Database {
private static $conn = NULL;
public function __construct(...) {
self::$conn = new mysqli(...);
}
public static function getInstance() {
return self::$conn;
}
}
您可以使用它来获取当前连接;
// initailise connection
$conn = new Database(...);
function foo() {
$db = Database::getInstance();
// do stuff
}
您可以获得MySQLi连接的完整包装类,例如this PHP-MySQLi-Database-Class,它们也有查询的辅助方法。这意味着您不必担心自己维护包装器类。
答案 1 :(得分:0)
您可以使用与Singleton设计模式非常相似的第一个示例。每次都避免创建新的数据库连接。
下面的例子显示了使用类,虽然不是你要问的,但可能你应该考虑。
singleton.php
<?php
class Database
{
// Store the single instance of Database
private static $m_pInstance;
private $db_host='localhost';
private $db_user = 'root';
private $db_pass = '';
private $db_name = 'databasename';
// Private constructor to limit object instantiation to within the class
private function __construct()
{
mysql_connect($this->db_host,$this->db_user,$this->db_pass);
mysql_select_db($this->db_name);
}
// Getter method for creating/returning the single instance of this class
public static function getInstance()
{
if (!self::$m_pInstance)
{
self::$m_pInstance = new Database();
}
return self::$m_pInstance;
}
public function query($query)
{
return mysql_query($query);
}
}
?>
&安培;我们可以从其他文件或函数中调用它:
<?php
include 'singleton.php';
$pDatabase = Database::getInstance();
$result = $pDatabase->query('...');
?>