Is object-oriented programming inherently modular, or are there additional considerations for modular design?

Object-oriented programming is inherently modular, as it allows for the creation of classes that encapsulate data and behavior. However, additional considerations for modular design include creating classes that are cohesive and have a single responsibility, as well as using interfaces to define contracts between classes. By following these principles, you can ensure that your code is modular and easy to maintain.

<?php

interface Logger {
    public function log($message);
}

class FileLogger implements Logger {
    public function log($message) {
        // Log message to a file
    }
}

class DatabaseLogger implements Logger {
    public function log($message) {
        // Log message to a database
    }
}

class User {
    private $logger;

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

    public function createUser($username) {
        // Create user logic

        $this->logger->log('User created: ' . $username);
    }
}

$fileLogger = new FileLogger();
$user = new User($fileLogger);
$user->createUser('john_doe');

$databaseLogger = new DatabaseLogger();
$user = new User($databaseLogger);
$user->createUser('jane_smith');

?>