在PHP中扩展类响应

在PHP中扩展类响应,php,object,sqlite,class-extensions,Php,Object,Sqlite,Class Extensions,我在一个使用mySQL和SQLite DB的项目中工作。我的目标是使代码能够处理这两种数据库类型。我使用mysqli类为mySQL开发了代码,现在我想对其进行修改,使其也适用于SQLite3对象 SQLite3类实现了与mysqli相同的方法(至少是我使用的那些方法),但有时使用不同的名称。例如,mysqli::fetch_array()变为SQLite3::fechArray()。因此,我正在扩展SQLite3和SQLite3Result类,以实现我需要的方法。例如: class SQLite

我在一个使用mySQL和SQLite DB的项目中工作。我的目标是使代码能够处理这两种数据库类型。我使用
mysqli
类为mySQL开发了代码,现在我想对其进行修改,使其也适用于
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
对象(我自己的扩展类)。

您可以尝试创建$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;
    }
}

一种方法是将其进一步抽象,而不是扩展
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);
}

我可以推荐一本好书:是的,我明白。正确的方法是使用我自己的PDO类,这样可以确保所有方法都可以独立于我使用的数据库使用。我试试看。非常感谢您的回答。实际上,我建议使用PHP中内置的PDO类。既然可以使用,为什么还要自己写呢?我不是这个意思。我说的是做一个使用PDO类的类(可能是扩展它),而不是创建一个完整的PDO类。这样,我可以随时添加方法来更改目标数据库。谢谢你的回答,但我不明白你的建议。问题不是获取$res,而是使$res成为一个SQLiteResultEx对象(现在它是一个SQLiteResult类对象)。非常感谢。这就是我一直在寻找的。回答得好!。