This is going to take a bit to explain. I’m creating my first real-world web application, and I’d to do it properly. I have very little PHP experience, but vast experience in other languages so technical skill isn’t a problem, it’s more conventions of the language. I’m following the MVC pattern, and I am at the stage where I’m implementing user registration for the application.
To standardise connections to the database, I’ve created a Config class with a static getConnection method, which creates a mysqli connection object. This isn’t a problem, it’s the next bit that is.
To make my classes a bit more readable, I have various functions built into them that make database calls. For example, my User class has a getFriends method like so:
class User
{
public $id;
public getFriends()
{
return UserController::getFriends($id);
}
}
But as it stands now, if I implement it that way, it means creating a connection for every query on a page, probably many times in a single script, which is just horrific.
I was thinking about doing the same as above, but pass getFriends a mysqli object, which in turn passes one to UserController::getFriends as well, but that feels messy, and frankly poor form, even though it would guarantee only one connection per script, a much better improvement.
I also thought about scrapping the idea of keeping the methods inside User altogether, and instead making calls like UserController::getFriends($connection, $id) directly in the script, with a single $connection declared at the beginning, in place of user->getFriends(). That seems like the absolute cleanest, nicest solution, but I’m unsure.
So, essentially, how do PHP folks normally do this sort of thing?
What I do in my MVC framework is create a db connection and assign it to the
Modelbase class (in the config):Then later on, anywhere, I can use:
because
User extends ModelandModelhas access to$db:self::dbObject()If I need my raw db connection, I either use
Model::dbObject()or$GLOBALS['db'], but I rarely do need the raw connection, because all db logic should be in your Models.