Соединение с БД — Singleton. Как передать в него данные пользователей?

Попытка использовать соединение с базой данных с синглтоном. __constructor был закрытым и возвращал экземпляр из статической функции.

class MyDbConn
{
protected $_conn;
protected $database;
protected $user;
protected $password;
protected $host = "localhost";
private static $instance;

private function __construct()
{
$this->db_conn = new PDO("mysql:host=$this->host;dbname=$this->database",$this->user,$this->password);
$this->db_conn->exec("set names utf8");
$this->_conn = $this->db_conn;
}

public static function returnInstance() {
if(self::$instance == null)
{
print "Object  created!";
self::$instance = new self;

}

return self::$instance;

}

public function returnconnection(){
return $this->_connection;
}
}

Теперь я могу получить доступ к экземпляру соединения из MyDbConn :: returnInstance () -> returnconnection ();

Но,
Как передать подробности моих пользователей и имя базы данных этому конструктору ?? Я не могу сделать :: returnInstance ($ username, $ password) или returnconnection ($ username, $ password).

Любые идеи, пожалуйста.

0

Решение

Вы можете сделать это с помощью global или с нормальным вызовом функции

<?php
class MyDbConn
{
protected $_conn;
protected $database;
protected $user;
protected $password;
protected $host = "localhost";
private static $instance;

private function __construct()
{

}

public static function returnInstance() {
if(self::$instance == null)
{
print "Object  created!";
self::$instance = new self;
}
return self::$instance;
}

private static function initDatabase(){
$database = self::returnInstance();
global $config;
$database->_conn = new PDO("mysql:host={$config['host']};dbname={$config['database']}",$config['user'],$config['password']);
$database->_conn->exec("set names utf8");
return $database;
}

public static function returnconnection(){
try {
$db = self::initDatabase();
return $db->_conn;
} catch (Exception $ex) {
echo "Error Establishing Database Connection " . $ex->getMessage();
return null;
}
}
}

и передать данные, как это

// will be called from initDatabase using global keyword
$config = array('host' => 'localhost', 'database' => 'db name','user' => 'user here','password' => '');

$db = MyDbConn::returnconnection();

Я не рекомендую Синглтон, и я предлагаю использовать Внедрение зависимости

1

Другие решения

Это довольно простой вопрос. Ваши переменные объявлены как защищенные, что означает, что вы можете получить их только внутри класса. Это на самом деле очень хорошо. Чтобы изменить эти переменные, вам нужно создать методы get и set, например, чтобы изменить методы записи $ user:

public function setUser($user)
{
$this->user = $user
}

public function getUser()
{
return $this->user;
}

//Then you need get your object via

$db = MyDbConn::returnInstance();

//set user

$db->setUser('john');

и это все. Более того, синглтон называется антипаттерном, потому что его сложно протестировать, и он очень похож на глобальные переменные, что не очень хорошо.

0

По вопросам рекламы [email protected]