Php 数据库类实现

Php 数据库类实现,php,oop,pdo,odbc,Php,Oop,Pdo,Odbc,我创建了一个扩展PDO的连接类,使用诸如modelize、get_tables、create、insert等方法。。。它与MySQL配合得很好 然后我创建了一个History类,它扩展了连接,并在每次对DB执行操作时将CRUD历史添加到日志文件或表中。它们都为所有与CRUD相关的方法实现了一个接口。它仍然可以很好地与MySQL配合使用 现在,我需要使用SQLite 我有很多连接函数必须重写,所以我想我可以保留我的连接类,用这些DB特定的函数创建一个接口(引擎),并为MySQL和SQLite开发特

我创建了一个扩展PDO的连接类,使用诸如modelize、get_tables、create、insert等方法。。。它与MySQL配合得很好

然后我创建了一个History类,它扩展了连接,并在每次对DB执行操作时将CRUD历史添加到日志文件或表中。它们都为所有与CRUD相关的方法实现了一个接口。它仍然可以很好地与MySQL配合使用

现在,我需要使用SQLite

我有很多连接函数必须重写,所以我想我可以保留我的连接类,用这些DB特定的函数创建一个接口(引擎),并为MySQL和SQLite开发特定的类来扩展连接

但是现在如果我想使用历史记录-它没有特定于DB的方法。。。我该怎么办

我想知道构建这些类的最佳方式是什么

谢谢

namespace bbn\db;

class connection extends \PDO implements actions, api, engines{
  public function __construct($cfg){
    ...
  }
  ...
}

interface api
{

    public function select($table, $fields, $where, $order, $limit, $start);

    public function insert($table, array $values, $ignore);

    public function insert_update($table, array $values);

    public function update($table, array $values, array $where);

    public function delete($table, array $where);

    public function insert_ignore($table, array $values);
}


interface engines
{

    public function __construct($cfg);

    public function change($db);

    public function get_full_name($table, $escaped=false);

    public function disable_keys();

    public function enable_keys();

    public function get_databases();

    public function get_tables();

    public function get_columns($table);

    public function get_keys($table);

    public function get_create($table);

    public function get_delete($table, array $where);

    public function get_select($table, array $fields = array(), array $where = array(), $order, $limit, $start, $php = false);

    public function get_insert($table, array $fields = array(), $ignore = false, $php = false);

    public function get_update($table, array $fields = array(), array $where = array(), $php = false);

    public function create_db_index($table, $column);

    public function delete_db_index($table, $column);

}

class history extends connection implements api
{
    ...
}

class mysql extends connection implements engines
{
  ...
}

class sqlite extends connection implements engines
{
  ...
}

如果您想知道“actions”接口是由另一个扩展PDO语句的类实现的(但它与我的问题无关)

这是一项艰巨的任务——在PHP中重写SQL。祝你好运it@Your常识:也许你可以忘记整个mockable数据库的野心,把重点放在类结构问题上:)我认为最好的办法是向
history
对象中注入一个连接,而不是从
connection
扩展
history
。因此,您在历史对象中有一个方法
setConnection($connection)
,并使用它。我对您的问题没有答案,但是我建议您在重写api接口时使用SQL方言(可能是SQL-92?),这很可能由MySQL和SQLite实现(可能还有其他数据库引擎,因为您永远不知道何时需要使用Oracle、DB2等)是SQL的扩展,无法在其他数据库上运行。触发器如何?sqlite还支持触发器。触发器是将操作保存到历史记录表的最佳方式。另一种方法是在每个db操作上调度事件。使用事件,可以使历史记录类完全独立。