Я немного застрял в следующей проблеме: я хотел бы, чтобы все мои классы использовали только одно соединение mysqli. Мне не особенно нравится внедрение зависимостей (мне кажется нелегким передавать соединение через конструктор), поэтому я реализовал синглтон. Это хорошо работает, за исключением следующей проблемы:
class Admin {
private $DB;
public function __construct() {
$this->DB = new DB::get_instance();
}
public function get_all_users() {
$this->DB->query('SELECT `email` FROM `users`');
while ($row = $this->DB->result->fetch_row()) { $users[] = new User($row[0]); }
return $users;
}
}
class User {
private $DB;
public function __construct($email = FALSE){
$this->DB = new DB;
if ($email) {
$this->load($email);
}
}
public function load($email){
$this->DB->query('SELECT * FROM `users` WHERE email = "'.$this->email.'";'); // Problem!
// etc.
}
Это не работает должным образом (= возвращает только одного пользователя вместо всех), так как query () в User перезаписывает «mysqli_result var» от Admin новым запросом (что, очевидно, имеет смысл, поскольку есть только один экземпляр БД, так как это синглтон). Так что из-за этой вложенности запросов синглтон не будет работать.
То, что я хотел бы сделать сейчас, - это хранить соединение в отдельном одноэлементном классе и создавать новые классы БД для запросов и т. Д. На ходу (в которых будет использоваться соединение из одноэлементного класса). В основном как то так:
class DB extendes Connection { .... } // Called as $DB = new DB in other classes
class Connection extends mysqli { .... } // This is a singleton
Но я просто не могу понять это. Если я вызову parent :: __ construct () из БД, это создаст новый экземпляр Connection, который, очевидно, не то, что я ищу. Клонирование соединения, очевидно, тоже не будет работать. Как я могу сказать БД использовать ссылку mysqli из Соединения без фактического создания нового объекта Соединения?
Надеюсь, я более или менее четко изложил свою проблему :) Как уже упоминалось выше, я несколько застрял и до сих пор не нашел полезных советов