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
,反之亦然。这是不是表示我不能分开交易?
如果我不能消除循环引用,那么它们应该在一个类中?
把他们分开有什么好处?
我会把它们放在一个类中,除非你能想出一个很好的理由把它们分开。