2016-09-13 9 views
0

一个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个方法是一样的东西“交易”,所以让他们移动到其他类:

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,反之亦然。这是否表明我不能分开交易?

+0

这完全没有意义。 'mysql _ *()'函数已经被拒绝并且已经从PHP 7中移除。你正在鞭a一只已死的恐龙。如果这是一个全新的项目,请改用PDO。 –

+1

是的,这是正确的,我知道。这一次忽视这个事实,关注问题本身 –

回答

1

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

将它们分开有什么好处?

我会让他们在一个班级,除非你能想出一个很好的理由来分裂他们。

相关问题