Properly using classes in other classes in php?
class, database, mysql, php
Solution
There are a couple of ways of doing that. Global variables is certainly one way and the most looked down upon too. You can create a Singleton and all other classes that need database access would call upon this singleton.
final class Database {
private static $connection;
public static function getInstance() {
if(self::$connection == NULL) {
self::$connection = // init your database connection
}
return self::$connection;
}
}
And use this database connection object in whatever class needs it.
class Application {
public function displayVar() {
echo 'hello world';
}
public function getVar() {
$db = Database::getInstance();
$sql = foo;
$db->query($sql);
}
}
This is all well for a start and a great step beyond using global variables, but you can do better with Dependency Injection. Dependency Injection is a simple concept that if a class has any external dependencies, such as the database connection in your example, you explicitly pass those to the needy class in its constructor or a method. So the new code would look something like Jonathan's solution. A major advantage of using dependency injection is in unit testing, where you can easily replace this actual database object with a mock object and pass it to whoever needs it.
class Application {
private $db;
public function __construct(Database $db) {
$this->db = $db;
}
public function displayVar() {
echo 'hello world';
}
public function getVar() {
$sql = foo;
$this->db->query($sql);
}
}
For smaller projects, you can easily do it yourself. For large projects, there are various DI frameworks available for PHP
Problem
Should have asked someone this a long time ago. What is the best way to use other classes within another class? For instance, lets say I have an application class: ``` class Application { public function displayVar() { echo 'hello world'; } } ``` and a database class ``` class Database { // connects to db on construct public function query() { // queries db } } ``` now, i want to add a function to my application class that uses a function from the db class ``` class Application { public function displayVar() { echo 'hello world'; } public function getVar() { global $db; $sql = foo; $db->query($sql); } } ``` so then I have ``` $db = new Database(); $app = new Application(); $app->getVar('var'); ``` Is there a better way of doing this? Really what I am looking for is the standard way of doing it, not another way of rigging it.