2012-06-04 24 views
0

我正在用PHP编写一个简单的数据库抽象层。我目前正在研究查询构建器,构建SQL“代码”的类。PHP抽象层 - 从名字中获取类

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

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); 

我如何能做到这一点任何想法?

+0

这听起来像是一个完美匹配的老式战略模式。 – kingcoyote

+5

你应该有一个'MySQL engineBuilder'或'PgSQLQueryBuilder'的实例'$ engine'。这两个类都应该实现一个接口'SQLQueryBuilder',它指定一个公共方法'buildInsert($ table,$ data)'。这样,你可以简单地调用'$ engine-> buildInsert($ table,$ data);'。这是正确的面向对象的方式。 – Niko

回答

1

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

$statement = call_user_func(array($dbengine . 'QueryBuilder', 'buildInsert'), $table, $data); 

但我会尼科的评论表示赞同,有建设者的情况下会显得更漂亮。

更新:

随着作为尼科建议,你可以只是做的方式:

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

所以根本不需要if S,代码看起来更短和更清洁的...

+0

它不一定是静态的。如你所说,非静态看起来更好。我在摆弄它,我会看看我能想出什么。 – EClaesson