Если я не могу исключить циклические ссылки, то они должны быть в одном классе?

реализация 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

Решение

Если я не могу исключить циклические ссылки, то они должны быть в одном классе?

Какая польза от их разделения?

Я бы оставил их в одном классе, если у вас не будет действительно веской причины разделить их.

1

Другие решения

Других решений пока нет …