Se está tentando fazer orientado a objetos, já está fazendo errado. Um método de login, apenas realiza o login. Qualquer coisa além disso, é além da responsabilidade dele. Ou seja, estará violando a S.R.P. (Single Responsibility Principle). Além disso, seu código possui falhas de segurança.   Voltando ao ponto principal, detenha-se a uma interface lógica. Como, por exemplo: A interface LoginService, define quem gerencia o Login do sistema. Ela fica responsável por cuidar de qualquer aspecto do login (sessão de usuário, quanto tempo expira, se há usuário logado, "lembra-me", etc...). /** * Responsible by the login management * @author Gabriel Heming **/ interface LoginService { /** * Realize the login of an user * @param string $username * @param string $password * @throws RuntimeExpception If it isn't possible to realize the login **/ public function login(string $username , string $password) : void; /** * Return if an user is logged * @return boolean **/ public function hasUserLogged() : bool; /** * Return the user authenticated * @return User * @throws RuntimeExpception If there isn't user authenticated **/ public function hasUserAuthenticated() : bool; } Perceba que, conforme documentado, o método login não retorna absolutamente nada, apenas lançará uma exception quando não for possível realizar o login. Mostrarei melhor mais para o fim.   Para gerenciar o login, LoginService precisa autenticar um usuário. Para isso, ela faz o uso da interface UserService Essa interface, por sua vez, trata dos aspectos do usuário. Ou seja, toda a regra de negócio que é pertinente a um usuário. /** * Manage any aspects of an user * @author Gabriel Heming **/ interface UserService { /** * Authenticate the user * @param string $username * @param string $password * @return boolean True if the user exists and the password match **/ public function auth(string $username , string $password) : bool; /** * Return an user by his username * @param string $username * @return User The User object **/ public function getUser(string $username) : User; } Já a interface UserService, trata dos aspectos do usuário. O método auth (autenticação), ele pode ser contraditório aonde deve estar. Entretanto, vamos aos "aspectos comuns" de onde ele pode ser utilizado:   - Login; - Alteração de senha (quando a senha anterior deve ser validada para que uma nova senha seja inserida).   Se for ir mais a fundo: - Autenticação via serviços (WS, Rest, API, etc...).   Ou seja, o método se preocupa apenas em autenticar o usuário. Ele não precisa informar se o problema é o usuário que não existe ou a senha que não confere, apenas se autenticou ou não.   Isso são interfaces básicas, bem grosseiras mesmo. Entretanto, demonstram o que cada participante deve se preocupar.   Quanto ao uso, bem, a coisa fica bem simples: try { //instância do serviço com injeção de dependencia do storage $loginService = new LoginService(new mysqli(/**dados de conexão**/)); $loginService->login('usuario' , 'minhasenha'); echo "login realizado com sucesso"; $user = $loginService->getUserAuthenticated(); echo "Usuário logado: ".$user->getNome(); } catch (\RuntimeException $exception) { echo $exception->getMessage(); } Do ponto de vista de orientação a objetos, o que a classe Login faz não é importante. Internamente, ela está utilizando o UserService para autenticar o usuário e para retornar o usuário que está autenticado, mas isso não é importante para a interface.   Agora, do ponto de vista de segurança é outra história e você precisa saber como está sendo realizado o login. E você pode verificar mais no link abaixo: