0

我正在用 PHP 构建一个 API,我有一个问题。我正在使用类,其中一些类需要访问我的数据库。但是,我不想在每个类中为数据库定义变量以便打开它,或者必须将我的 mysqli 对象作为每个类构造函数的参数发送。

解决此问题的最佳方法是什么?我是否定义了某种全局变量?

4

3 回答 3

4

一个经典的解决方案如下

  1. 创建 dbatabase 处理程序类的实例,可以是原始 mysqli(更差)或更好的抽象类(更好)
  2. 在应用程序类的构造函数中,将此 db 类实例作为参数并将其分配给局部变量
  3. 将此变量与您的班级一起使用。

一个简单的例子:

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']);
于 2013-08-23T06:24:38.107 回答
0

在一个系统中,我维护我的应用程序需要访问它自己的 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,则无法使用此解决方案。

于 2013-08-23T04:51:38.853 回答
0

使用静态类怎么样?

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
于 2013-08-23T04:36:19.363 回答