How can the principles of Dependency Injection be applied effectively in PHP projects to improve code quality and maintainability?

Issue: Dependency Injection helps improve code quality and maintainability by decoupling dependencies from the classes that use them, making it easier to test, reuse, and maintain code. PHP Code Snippet:

// Define an interface for the dependency
interface LoggerInterface {
    public function log($message);
}

// Implement a class that uses the dependency through constructor injection
class User {
    private $logger;

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

    public function createUser($username) {
        // Create user logic
        $this->logger->log('User created: ' . $username);
    }
}

// Implement a class that implements the LoggerInterface
class FileLogger implements LoggerInterface {
    public function log($message) {
        // Log message to a file
        echo $message . ' logged to file';
    }
}

// Create instances of the classes and inject the dependency
$fileLogger = new FileLogger();
$user = new User($fileLogger);

$user->createUser('john_doe');