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.

Original source