Php 应用SRP会导致问题。如何?

Php 应用SRP会导致问题。如何?,php,single-responsibility-principle,Php,Single Responsibility Principle,我正在使用php创建自己的查询生成器,它还可以执行查询并从数据库中获取结果。起初,我在一个类中拥有这个功能,但是仔细考虑之后,我认为QueryBuilder和DBProcessor应该是两个独立的类 class QueryBuilder { var $query; ... function select() function from() function join() function where() ... } class DbP

我正在使用php创建自己的查询生成器,它还可以执行查询并从数据库中获取结果。起初,我在一个类中拥有这个功能,但是仔细考虑之后,我认为QueryBuilder和DBProcessor应该是两个独立的类

class QueryBuilder {

    var $query;

    ...
    function select()
    function from()
    function join()
    function where()
    ...
}

class DbProcessor {

    ...
    function execute()
    function rowCount()
    function startTransaction()
    function lastInsertId()
    ...
}
我遇到的问题是,在一起使用thse的同时,还要坚持其他良好的编程约定。(松耦合)

我是否应该在QueryBuilder中创建一个构造,以便在创建时必须传入DbProcessor的实例?然而,这个想法似乎走下坡路了,因为我最终会在QueryBuilder中复制方法名,只是为了调用DbProcessor中的方法,就像下面这样

class QueryBuilder {

    var $DbProcessor;

    function select()
    ...

    function rowCount() 
    {
        $this->DbProcessor->rowCount()
    }

    function startTransaction() 
    {
        $this->DbProcessor->startTransaction()
    }
}
这种方式似乎只是添加了重复的方法名,并使得只将DbProcessor放在QueryBuilder中似乎更好


我怎样才能在这里实现我想要的呢?

我在一个个人项目中也做过类似的事情。在我的例子中,您的
QueryBuilder
,只负责生成返回字符串变量的sql语句,不执行任何操作。只有一个纯字符串SQL。另一方面,
数据库
有一个方法来执行作为参数传递的SQL语句。然后,为了协调整个查询执行,我有另一个类,
xxxRepository.java
,其中我将有
getXXXById()
类型的所有实体方法。这将调用
QueryBuilder.java
返回我想要执行的SQL,然后将其传递给
Database.java execute()
方法以获得结果