0

我正在一个使用 mySQL 和 SQLite DB 的项目中工作。我的目标是使代码能够与两种数据库类型一起使用。我使用类开发了 mySQL 的代码,mysqli现在我想修改它以使其也适用于SQLite3对象。

SQLite3mysqli类实现与(至少,我使用的方法)相同的方法,但有时使用不同的名称。例如,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对象(我自己的扩展类)。

4

2 回答 2

1

一种方法是进一步抽象它,而不是扩展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);
}
于 2015-04-21T08:46:42.397 回答
-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;
    }
}
于 2015-04-21T08:11:51.563 回答