如果我不能消除循环引用,那么它们应该在一个类中


If I cant eliminate circular references, then they should be in one class?

SQL实现:

abstract class SQL
{
    abstract public function connect();
    abstract public function query($sql);
    abstract public function queryAndReturn($sql);
    abstract public function startTransaction();
    abstract public function commit();
    abstract public function rollback();
}
class MySQL extends SQL
{
    public function connect()
    {
        mysql_connect (....)
    }
    public function query($sql)
    {
        return mysql_query($sql);
    }
    public function queryAndReturn()
    {
        $result = $this->query($sql);
        $results = [];
        whilte ($item = mysql_fetch_assoc($result))
        {
            $results[] = $item;
        }
        return $results;
    }
    public function startTransaction()
    {
        return $this->query('START TRANSACTION');
    }
    public function commit()
    {
        return $this->query('COMMIT');
    }
    public function rollback()
    {
        return $this->query('ROLLBACK');
    }
    public function runAtomicFunction ('Closure $function)
    {
        try
        {
            $this->query('SET autocommit=0');
            $this->startTransaction();
            $function();
            $this->commit();
        }
        catch (Exception $e)
        {
            $this->rollback();
        }
    }
}

最后4个方法有点像"transaction",所以让我们把它们移到另一个类中:

class MySQL extends SQL
{
    public function connect()
    {
        mysql_connect (....)
    }
    public function query($sql)
    {
        return mysql_query($sql);
    }
    public function queryAndReturn()
    {
        $result = $this->query($sql);
        $results = [];
        whilte ($item = mysql_fetch_assoc($result))
        {
            $results[] = $item;
        }
        return $results;
    }

    public function getNewTransaction()
    {
        return new Transaction($this);
    }
}

class Transaction
{
    private $db;
    public function __construct(Sql $db)
    {
         $this->db = $db;
    }
    public function startTransaction()
    {
        return $this->db->query('START TRANSACTION');
    }
    public function commit()
    {
        return $this->db->query('COMMIT');
    }
    public function rollback()
    {
        return $this->db->query('ROLLBACK');
    }
    public function runAtomicFunction ('Closure $function)
    {
        try
        {
            $this->db->query('SET autocommit=0');
            $this->db->startTransaction();
            $function();
            $this->db->commit();
        }
        catch (Exception $e)
        {
            $this->db->rollback();
        }
    }
}
$sql = new MySQL();
$t = $sql->getNewTransaction();
$t->runAtomicFunction(...);

这都很好,但这是循环引用的情况。Sql依赖于Transaction,反之亦然。这是不是表示我不能分开交易?

如果我不能消除循环引用,那么它们应该在一个类中?

把他们分开有什么好处?

我会把它们放在一个类中,除非你能想出一个很好的理由把它们分开。