object — Расширить ответ класса в Stack Overflow

Я работаю в проекте с использованием 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 объект (мой собственный расширенный класс).

0

Решение

Одним из способов было бы абстрагировать его немного дальше, вместо расширения 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);
}
1

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

Вы можете попытаться создать $ 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;
}
}
-1

По вопросам рекламы [email protected]