How can the principles of object-oriented programming be effectively applied to create a login system with role-based access control in PHP?

To create a login system with role-based access control in PHP using object-oriented programming principles, you can create classes for User, Role, and LoginSystem. The User class can store user information, the Role class can define different roles with corresponding permissions, and the LoginSystem class can handle user authentication and authorization based on roles.

```php
<?php

class User {
    private $username;
    private $password;
    private $role;

    public function __construct($username, $password, $role) {
        $this->username = $username;
        $this->password = $password;
        $this->role = $role;
    }

    public function getUsername() {
        return $this->username;
    }

    public function getPassword() {
        return $this->password;
    }

    public function getRole() {
        return $this->role;
    }
}

class Role {
    private $name;
    private $permissions;

    public function __construct($name, $permissions) {
        $this->name = $name;
        $this->permissions = $permissions;
    }

    public function getName() {
        return $this->name;
    }

    public function getPermissions() {
        return $this->permissions;
    }
}

class LoginSystem {
    private $users = [];

    public function addUser(User $user) {
        $this->users[$user->getUsername()] = $user;
    }

    public function login($username, $password) {
        if (isset($this->users[$username]) && $this->users[$username]->getPassword() == $password) {
            return $this->users[$username];
        }
        return null;
    }

    public function checkPermission(User $user, $permission) {
        $role = $user->getRole();
        if ($role && isset($this->roles[$role]) && in_array($permission, $this->roles[$role]->getPermissions())) {
            return true;
        }
        return false;
    }
}

// Example usage
$adminRole = new Role('admin', ['manage_users', 'manage_roles']);
$userRole = new Role('user', ['view_content']);

$user1 = new User('admin', 'admin123', 'admin');
$user2 = new User('user', 'user123', 'user');

$loginSystem = new LoginSystem();
$loginSystem->addUser($user1);
$loginSystem->add