How can dependency injection be utilized to avoid the issue of modifying all objects through one object in PHP classes?

When all objects are modified through one object in PHP classes, it creates tight coupling and makes the code harder to maintain and test. To avoid this issue, dependency injection can be utilized. By injecting the necessary dependencies into each object instead of having them controlled by a single object, we can achieve better separation of concerns and improve code reusability.

class Database {
    private $connection;

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

    public function query($sql) {
        // Perform database query using $this->connection
    }
}

class UserRepository {
    private $database;

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

    public function getUserById($id) {
        // Use $this->database to fetch user data
    }
}

$connection = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$database = new Database($connection);
$userRepository = new UserRepository($database);

$user = $userRepository->getUserById(1);