What are the best practices for handling data management and logic separation in PHP classes?

When working with PHP classes, it's important to separate data management (such as database interactions) from business logic to maintain a clean and maintainable codebase. One way to achieve this is by using separate methods for data manipulation and business logic within your classes. This separation allows for easier testing, debugging, and future modifications.

class User {
    private $db;

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

    // Data management methods
    public function getUserById($userId) {
        // Database query to fetch user data
        return $userData;
    }

    public function updateUserEmail($userId, $newEmail) {
        // Database query to update user email
    }

    // Business logic methods
    public function sendEmailNotification($userId) {
        $userData = $this->getUserById($userId);
        // Business logic to send email notification
    }
}