2015-04-21 6 views
0

Я работаю над проектом с использованием mySQL и SQLite DB. Моя цель - сделать код способным работать с обоими типами баз данных. Я разработал код для mySQL, используя класс mysqli, и теперь я хочу его изменить, чтобы он также работал с объектами SQLite3.Расширение ответа класса в PHP

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 объекта (мой собственный класс).

+1

Я могу порекомендовать хорошее чтение: http://php.net/manual/en/intro.pdo.php – Michael

+0

Да, я понимаю. Правильный способ - использовать мой собственный класс PDO, поэтому это гарантирует, что все методы доступны независимо от используемой базы данных. Я постараюсь сделать это. Большое спасибо за ваш ответ. – Pepin

+0

На самом деле я предлагаю использовать классы PDO, встроенные в PHP. Почему бы вам написать его самостоятельно, когда он будет готов к использованию? – Michael

ответ

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); 
} 
+0

Большое спасибо. Это то, что я искал. Хороший ответ !. – Pepin

+0

Не проблема. Обязательно отметьте мой ответ ;-) –

-1

Вы могли бы попытаться создать $ рес в качестве конкретного параметра подкласса и ссылаться на него непосредственно с

$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; 
    } 
} 
+0

Спасибо за ваш ответ, но я не понимаю, что вы предлагаете. Проблема заключается не в получении $ res, а в том, что $ res становится объектом SQLiteResultEx (теперь это объект класса SQLiteResult). – Pepin