What are the best practices for passing configurations and connections using Dependency Injection in PHP?

When using Dependency Injection in PHP, it is important to pass configurations and connections as dependencies rather than hardcoding them within classes. This allows for better flexibility, testability, and maintainability of the code. One common approach is to create a configuration class or interface that holds all the necessary settings and pass an instance of this class to the classes that need it.

// Configuration class
class Config {
    private $dbHost;
    private $dbUser;
    private $dbPass;
    
    public function __construct($dbHost, $dbUser, $dbPass) {
        $this->dbHost = $dbHost;
        $this->dbUser = $dbUser;
        $this->dbPass = $dbPass;
    }
    
    public function getDbHost() {
        return $this->dbHost;
    }
    
    public function getDbUser() {
        return $this->dbUser;
    }
    
    public function getDbPass() {
        return $this->dbPass;
    }
}

// Database class
class Database {
    private $config;
    
    public function __construct(Config $config) {
        $this->config = $config;
    }
    
    public function connect() {
        $host = $this->config->getDbHost();
        $user = $this->config->getDbUser();
        $pass = $this->config->getDbPass();
        
        // Connect to database using $host, $user, $pass
    }
}

// Usage
$config = new Config('localhost', 'root', 'password');
$database = new Database($config);
$database->connect();