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.
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
будет это и никто другой.
Вы можете создать класс с именем 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.
Создайте родительский класс с подключением к нему и создайте дочерний класс, который расширяет родительский класс
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);
}
}