PHP抽象层-从名称获取类

PHP抽象层-从名称获取类,php,sql,database,Php,Sql,Database,我正在用PHP编写一个简单的数据库抽象层。我目前正在研究查询生成器,这些类构建SQL“代码” 有没有更好的方法来做这样的事情 if($dbengine == "MySQL") { MySQLQueryBuilder::buildInsert($table, $data); } else if($dbengine == "PgSQL") { PgSQLQueryBuilder::buildInsert($table, $data); } // And so on... 我的想法是

我正在用PHP编写一个简单的数据库抽象层。我目前正在研究查询生成器,这些类构建SQL“代码”

有没有更好的方法来做这样的事情

if($dbengine == "MySQL")
{
    MySQLQueryBuilder::buildInsert($table, $data);
}
else if($dbengine == "PgSQL")
{
    PgSQLQueryBuilder::buildInsert($table, $data);
}
// And so on...
我的想法是:

$querybuilder = get_class_from_name($dbengine . "QueryBuilder");
$querybuilder::buildInsert($table, $data);

有什么办法吗?

如果您希望它是静态的,您可以这样做:

$statement = call_user_func(array($dbengine . 'QueryBuilder', 'buildInsert'), $table, $data);
但我同意Niko的评论,有一个建筑商的例子看起来会更好

更新:

按照Niko的建议,你可以:

$className = $dbengine . 'QueryBuilder';
$builder = new $className();
$statement = $builder->buildInsert($table, $data);

因此,如果根本不需要
,那么代码看起来更短更干净……

这听起来像是与古老的策略模式的完美匹配。您应该有一个
MySQLQueryBuilder
PgSQLQueryBuilder
$engine
实例。这两个类都应该实现一个接口
SQLQueryBuilder
,该接口指定一个公共方法
buildInsert($table,$data)
。这样,您就可以简单地调用
$engine->buildInsert($table,$data)。这是正确的面向对象方法。它不必是静态的。正如你所说,非静态看起来更好。我在摆弄它,看看能想出什么来。