【问题标题】:Extend class response in PHP在 PHP 中扩展类响应
【发布时间】:2015-04-21 08:03:40
【问题描述】:

我正在一个使用 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 对象(我自己的扩展类)。

【问题讨论】:

  • 我可以推荐一本好书:php.net/manual/en/intro.pdo.php
  • 是的,我明白了。正确的方法是使用我自己的 PDO 类,这样可以确保所有方法都可以独立于我使用的数据库使用。我会尝试这样做。非常感谢您的回答。
  • 其实我建议使用PHP内置的PDO类。当它准备好使用时,你为什么要自己编写它?
  • 这不是我的意思。我正在谈论做一个使用 PDO 类的类(也许扩展它),而不是创建一个完整的 PDO 类。这样,我可以随时添加更改目标数据库的方法。

标签: php object sqlite class-extensions


【解决方案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);
}

【讨论】:

  • 非常感谢。这就是我一直在寻找的。好答案!。
【解决方案2】:

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

【讨论】:

  • 感谢您的回答,但我不明白您的建议。问题不是获取$res,而是让$res变成SQLiteResultEx对象(现在是SQLiteResult类对象)。
猜你喜欢
  • 1970-01-01
  • 2015-11-03
  • 1970-01-01
  • 2012-06-27
  • 2012-07-31
  • 2013-02-06
  • 2017-01-09
  • 2016-05-09
相关资源
最近更新 更多