Избегайте создания новых PDO в каждом классе

   function __construct($name, $lastName, $address, $rollNo)
{
$this->name = $name;
$this->lastName = $lastName;
$this->address = $address;
$this->rollNo = $rollNo;

$this->conn = new \PDO('mysql:host=localhost;dbname=students', 'root', '');
}

public function getUser($id){
$sql = "SELECT * FROM students WHERE id = ".intval($id);

foreach($this->conn->query($sql) as $row){
$user['name'] = $row['name'];
$user['address'] = $row['address'];
$user['roll_no'] = $row['roll_no'];
}
return $user;

}

Итак, я пытаюсь понять, как я могу использовать один объект PDO во всех моих классах, а не создавать $ conn во всех классах, таких как пользователи, курсы и т. Д.

Я встречал слова «Dependency Injection», «Singleton», «Factory», и для меня как для новичка все они перепутаны.

Также я хочу знать, является ли плохой практикой то, что я делаю в своем коде для создания новых объектов для PDO.

1

Решение

Singleton — это управляющий класс, который будет гарантировать, что одновременно будет существовать только один экземпляр данного объекта. Так что вместо звонка $conn = new PDO() в каждом объекте, создавая несколько экземпляров PDO(), вы можете написать одноэлементный класс с именем Database и использовать $conn = Database::instance() вместо.

class Database
{
static $instance = null;
static function instance()
{
if (self::$instance == null)
self::$instance = new PDO('mysql:host=localhost;dbname=students', 'root', '');
return self::$instance;
}
}

В основном то, что он делает, это создает PDO() Класс, если он не существует, и использовать его повторно, если он уже был создан ранее.

В качестве дополнительного преимущества вам также не потребуется распространять учетные данные базы данных по всему проекту. Класс Database будет это и никто другой.

2

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

Вы можете создать класс с именем say ‘Database’ для подключения к MySQL и настройки PDO.

так что-то вроде …

class Database{
private $host      = DB_HOST;
private $user      = DB_USER;
private $pass      = DB_PASS;
private $dbname    = DB_NAME;

private $dbh;
private $error;

public function __construct(){
// setup dsn
$dns = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;
try{
$this->dbh = new PDO($dsn, $this->user, $this->pass);
}
catch(PDOException $e){
$this->error = $e->getMessage();
}
}

}

А затем в других ваших классах просто назначьте класс переменной в других ваших классах, так что ..

$db = new Database();

Это позволит избежать дублирования вашего кода. Вы также можете создавать функции в классе Database для выполнения запросов PDO.

0

Создайте родительский класс с подключением к нему и создайте дочерний класс, который расширяет родительский класс

class Main {

protected $dbh;

function dbConnect() {

$options = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);

//DB_HOST, DB_NAME, DB_USER, DB_PASS are set via define()
//e.g. define("DB_HOST", "localhost");

$dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME;
$this->dbh = new PDO($dsn, DB_USER, DB_PASS, $options);

}

Затем..

class User extends Main {

function crudRead() {
parent::dbConnect(); //called from the main class
$db = $this->dbh->prepare('SELECT * FROM user');
$db->execute();
return $db->fetchAll(PDO::FETCH_ASSOC);
}
}
-2
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector