How can one effectively manage dependencies in PHP classes, especially when dealing with a large number of classes with similar dependencies?

To effectively manage dependencies in PHP classes, especially when dealing with a large number of classes with similar dependencies, it is recommended to use dependency injection. By injecting dependencies into classes rather than creating them within the class itself, you can easily manage and swap out dependencies as needed. This promotes better code reusability, testability, and maintainability.

class Database {
    protected $connection;

    public function __construct($host, $username, $password, $database) {
        $this->connection = new PDO("mysql:host=$host;dbname=$database", $username, $password);
    }

    public function query($sql) {
        return $this->connection->query($sql);
    }
}

class UserRepository {
    protected $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    public function getUsers() {
        return $this->db->query("SELECT * FROM users")->fetchAll();
    }
}

$db = new Database('localhost', 'root', '', 'my_database');
$userRepository = new UserRepository($db);
$users = $userRepository->getUsers();