Нужно ли передавать идентификатор соединения объектам классов

Avron2

Новичок
Горожу форум.
Коннект к БД происходит с помощью объекта (Singleton).
Вопрос: нужно ли передавать идентификатор соединения $link от объекта к объекту в констукторы? Это необходимо, так как методы класса SQL, Themes, Topics, Messages будут использовать запросы к БД.

Класс соединения с БД (Singleton):
PHP:
<?php

class ConnectDB   {
	private $server = 'localhost';
	private $username = 'root';
	private $password = '';
	private $link;
 
	static private $instance = NULL;

    static function getInstance()  {
	   if (self::$instance == NULL)  {
           self::$instance = new ConnectDB();
	   }
       return self::$instance;
	} 
    
    private function __construct()   {
		
	}

	private function __clone() { 
        
    } 

    function Connect()   {
        $this->link = mysqli_connect($this->server,$this->username,$this->password) or die("Ошибка подключения к БД: ". mysqli_error());
        return $this->link;
    }  
    
    public function close()
	{
		return mysqli_close($this->link);
	}

	public function error()
	{
		return mysqli_error($this->link);
	}

}

?>

Класс SQL (функции для работы с БД)
PHP:
<?php
    Class SQL    {
        protected $db; //БАЗА ДАННЫХ
        protected $link; // ИД ПОДКЛЮЧЕНИЯ К БД (возвращает объект класса ConnectDB))
        private $result; // результат запроса

        public function __construct($link,$db)    { // передаем идентификатор соединения с сервером MySQL
            $this->link = $link;
            $this->db = $db;
        }    
        
        public function getField($field)  { /*возвращает значение поля $field в таблцие Themes, запись id = $this->id */
            $db_q = $this->link->query("SELECT ".$this->db." FROM forum.themes WHERE(id=".$this->id.") LIMIT 1");
            if(!$db_q)  
                return false; 
            $arr = $db_q->fetch_assoc();
            return $arr[$field];
        }

        public function add($id_parent, $theme, $description)   { /*Новая тема форума*/
            $db_q = $this->link->query("INSERT INTO ".$this->db." (id_parent, theme, description) VALUES ($id_parent, '$theme', '$description')");
            if(!$db_q)  
                return false; 
            else
                return true;
        }
        
        public function change($field, $value)   { /*Редактирование тема форума*/
            $db_q = $this->link->query("UPDATE ".$this->db." SET $field='$value' WHERE ($id=".$this->id.")");
            if(!$db_q)  
                return false; 
            else
                return true;
        }

        public function delete()   { /*Редактирование тема форума*/
            $db_q = $this->link->query("DELETE ".$this->db." FROM $field='$value' ".$this->db." WHERE ($id=".$this->id.")");
            if(!$db_q)  
                return false; 
            else
                return true;
        }
}
?>
Класс Themes, наследующий SQL:
PHP:
    class Themes extends SQL   {
        private $id;
        
        public function __construct($id = NULL, $link = NULL, $db="forum.themes")    {
            parent::__construct($link,$db);
            $this->id = $id;
        }
        

    }
 

Dovg

Продвинутый новичок
ИМХО это как раз тот случай, когда Singleton - это хорошо.
 

Avron2

Новичок
Так а как объект класса SQL будет знать идентификатор соединения, если его не передавать в конструкторе?
 

Avron2

Новичок
Может быть не понятен вопрос?
Я хочу в методах класса для запроса использовать запись $this->link->query();
Т.е., явно указывать идентификатор соединения с БД.
Может быть использовать в методах классах
PHP:
mysqli_query();
и не морочить голову?
Тем более, что соединение у нас одно, т.к. объект Singleton.
Подскажите, как правильно?
 

Avron2

Новичок
Тему перенес сюда, т.к. эта создана немного не в той тематике.
Прошу прощения.
 

Dovg

Продвинутый новичок
Avron2
В твоем синглтоне есть глобальная точка входа: ConnectDB::getInstance();
Экземляр передавать не надо, надо вызывать статичный метод, который будет возвращать экземпляр.
 

Avron2

Новичок
Значит конструктор класса SQL должен выглядеть таким образом?
PHP:
        public function __construct($db)    { 
            $this->link = ConnectDB::getInstance()->connect();
            $this->db = $db;
        }
 

Dovg

Продвинутый новичок
$this->link = ConnectDB::getInstance()->connect();
Накуя?

Вызывай там, где он тебе потребуется. Тащить его в члены класса ИМХО не имеет большого смысла .

ps. connect() лучше сделать лениво. Пусть коннектится по первому требованию.
 

Avron2

Новичок
В осной программе (реализация классов), я создаю объект подключения таким образом
PHP:
$link = ConnectDB::getInstance()->connect();
$theme = new Themes(null);
$add = $theme -> add(0,'Новая тема форума','Описание новой темы форума');
if (!$add)  {
  $err = new Error("Ошибка добавления темы");
  print ($err->show());
}
Тогда переменную $link вообще нужно убрать из класса SQL, а в методах класса вместо
PHP:
$this->link->query();
применять
PHP:
mysqli_query();
без явного указания идентификатора соединения $link? Ведь все-равно будет использоваться последнее подключение, а оно у нас первое и последнее (т.к. используется Singleton).
Или все-же в методе add() определять
PHP:
$link = ConnectDB::getInstance()->connect();
и передавать $link
PHP:
mysql_query("INSERT INTO ...",$link);
 
Сверху