I'm creating a web app with various classes for things like the user, Smarty template control, etc.
I already have a database class which is all well and good, but I'm concerned about the performance of it.
Currently, in another class, I'm doing $this->db = new DB() to create a local database instance, however the database class's __construct() function creates a new connection to the MySQL server every time I make a new DB() instance, which is obviously less than sensible. This means that each instance of all my different classes that uses the database class makes a connection to the server. I don't have a vast amount of classes, but I only want one per page load.
This is a stripped down sample of what I have at the moment:
// Database class used by multiple other classes
class DB {
private $dbh;
function __construct() {
$this->dbh = // PDO connection here
}
public function query($str) {
// Do a query
}
}
// Example class User
class User {
private $db; // Stores local instance of DB class.
function __construct() {
$this->db = new DB(); // Makes a new connection in DB::__construct()
}
public function login() {
$this->db->query('SELECT * FROM users');
}
}
I'm looking for the "best" or most common practice of doing this. I don't want to make 10-ish separate connections for each page load.
I want to know what the best way of using and managing a DB class in my application. My four thoughts are these:
- Would using a persistent connection to the MySQL server solve this multiple connection issue for me?
- Should I use a static factory class and return a DB instance instead of using
new DB()? - Is the proper solution to use an entirely static class and just do
DB::query()(for example) every time I reference it? - I often use multiple classes in another (so we might have class Folders which requires classes User, DB and Smarty). Is it general practice to
extendeach class somehow?
$this->dbfor each class is a little silly, but with singletons it makes sense; there are no scope issues and only once instance is ever created.