Properly using classes in other classes in php?

前端 未结 3 1568
终归单人心
终归单人心 2020-12-28 11:06

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

3条回答
  •  半阙折子戏
    2020-12-28 11:28

    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

提交回复
热议问题