What are some best practices for handling database connection details in PHP classes to improve reusability and security?

When working with database connection details in PHP classes, it is important to separate the connection details from the actual class logic to improve reusability and security. One way to achieve this is by using dependency injection to pass the database connection details to the class constructor. This allows for better separation of concerns and makes it easier to switch out database connections or update connection details without modifying the class itself.

<?php

class DatabaseConnection {
    private $host;
    private $username;
    private $password;
    private $database;

    public function __construct($host, $username, $password, $database) {
        $this->host = $host;
        $this->username = $username;
        $this->password = $password;
        $this->database = $database;
    }

    public function connect() {
        $conn = new mysqli($this->host, $this->username, $this->password, $this->database);

        if ($conn->connect_error) {
            die("Connection failed: " . $conn->connect_error);
        }

        return $conn;
    }
}

// Usage
$host = "localhost";
$username = "root";
$password = "password";
$database = "mydatabase";

$db = new DatabaseConnection($host, $username, $password, $database);
$conn = $db->connect();