Я работаю в проекте с использованием MySQL и SQLite DB. Моя цель — сделать так, чтобы код мог работать с обоими типами баз данных. Я разработал код для MySQL, используя mysqli
класс, и теперь я хочу изменить его, чтобы он также работал с SQLite3
объекты.
SQLite3
класс реализует те же методы, что и mysqli
(по крайней мере, те, которые я использую), но иногда используя разные имена. Например, mysqli::fetch_array()
становится SQLite3::fechArray()
, Так что я расширяю SQLite3 и SQLite3Result
классы для реализации методов, которые мне нужны. Например:
class SQLite3ResultEx extends SQLite3Result {
public function fetch_array() {
return parent::fetchArray();
}
}
Проблема в том, что я не знаю, как сделать, чтобы расширить ответ на SQLite3
класс, чтобы получить свой собственный SQLite3Response
расширенный класс. Я имею в виду:
class SQLite3Ex extends SQLite3 {
public function __construct($filename, $flags = null, $encryption_key = null) {
return parent::__construct($filename, $flags, $encryption_key);
}
public function query($query) {
$res = parent::query($query);
return $res;
}
}
Сейчас $res
является SQLite3Result
объект, но мне нужно это становится SQLite3ResultEx
объект (мой собственный расширенный класс).
Одним из способов было бы абстрагировать его немного дальше, вместо расширения SQLite3Result
Вы можете создать новый класс, который будет принимать SQLite3Result
объект, предоставьте свои собственные методы, которые затем прокси к результату.
class myResults
{
/**
* @var SQLite3Result
*/
protected $result;
/**
* Constructor
* @param SQLite3Result $result
*/
public function __construct(SQLite3Result $result)
{
$this->result = $result;
}
/**
* Fetch array of results
* @return array
*/
public function fetch_array()
{
return $this->result->fetchArray();
}
// Any other methods you need
}
Тогда ваш SQLite3Ex::query
метод становится:
/**
* Preform query
* @param string $query
* @return myResults
*/
public function query($query)
{
$res = parent::query($query);
return new myResults($res);
}
Вы можете попытаться создать $ res как определенный параметр вашего подкласса и ссылаться на него напрямую
$this->res = ...
так что ваш подкласс выглядит так:
class SQLite3Ex extends SQLite3 {
private $res;
public function __construct($filename, $flags = null, $encryption_key = null) {
return parent::__construct($filename, $flags, $encryption_key);
}
public function query($query) {
$this->res = parent::query($query);
return $res;
}
}