我正在用 PHP 构建一个 API,我有一个问题。我正在使用类,其中一些类需要访问我的数据库。但是,我不想在每个类中为数据库定义变量以便打开它,或者必须将我的 mysqli 对象作为每个类构造函数的参数发送。
解决此问题的最佳方法是什么?我是否定义了某种全局变量?
一个经典的解决方案如下
一个简单的例子:
class Foo()
{
protected $db;
function __construct($db);
{
$this->db = $db;
}
function getBar($id)
{
return $this->db->getOne("SELECT * FROM bar WHERE id=?i", $id);
}
}
$db = new safeMysql();
$foo = new Foo($db);
$bar = $foo->getBar($_GET['id']);
在一个系统中,我维护我的应用程序需要访问它自己的 MySQL 数据库,以及远程 Oracle 和 SQL Server 数据库,并且我为它使用了一个 trait。这是我的代码的简化,仅使用 MySQL:
dbaccess.php
trait DatabaseAccess {
protected $db;
private $host = 'host', $dbName = 'db', $username = 'username', $password = 'pword';
public function connectToMysql() {
$this->db= new mysqli(......);
}
}
然后在 myclass.php
require 'dbaccess.php';
class MyClass {
use DatabaseAccess;
//class code.....
}
DatabaseAccess 的所有元素都将可用,就像您在 MyClass 中手动键入它们一样。注意:如果您使用的是 PHP < 5.4,则无法使用此解决方案。
使用静态类怎么样?
class mysqli_wrapper {
private static $db = null;
public static function open() {
GLOBAL $opts; // this can be global or setup in other ways
if (!self::$db) {
self::close();
self::$db = null;
}
self::$db = @mysqli_connect('p:'.$opts['hn'], $opts['un'], $opts['pw'], $opts['db']);
return self::$db;
}
public static function query($qry) {
return mysqli_query ( self::$db, $qry );
}
public static function affected_rows() { return @mysqli_affected_rows(self::$db); }
public static function error() { return @mysqli_error(self::$db); }
public static function close() { @mysqli_close(self::$db); }
} // end mysqli_wrapper
mysqli_wrapper::open(); // Here's how to call it