How can the principles of Dependency Injection be applied to improve the modularity and maintainability of PHP code, such as in the case of integrating a CAPTCHA system with a guestbook class?

Issue: Integrating a CAPTCHA system with a guestbook class can lead to tightly coupled code, making it difficult to maintain and test. By applying the principles of Dependency Injection, we can improve modularity and maintainability by injecting the CAPTCHA system as a dependency into the guestbook class. PHP Code Snippet:

// Define the CAPTCHA interface
interface CAPTCHA {
    public function generate();
    public function validate($input);
}

// Implement a CAPTCHA system
class SimpleCAPTCHA implements CAPTCHA {
    public function generate() {
        // Generate CAPTCHA code
    }

    public function validate($input) {
        // Validate user input
    }
}

// Guestbook class with CAPTCHA dependency injected
class Guestbook {
    private $captcha;

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

    public function addEntry($name, $message, $captchaInput) {
        if ($this->captcha->validate($captchaInput)) {
            // Add entry to guestbook
        } else {
            // Display error message
        }
    }
}

// Implementation
$captcha = new SimpleCAPTCHA();
$guestbook = new Guestbook($captcha);
$guestbook->addEntry('John Doe', 'Hello World', 'captcha_input');