Prendere una classe sola e "valutarne" la programmazione ad oggetti è difficile. La valutazione va fatta sull'insieme.... in ogni caso, la variaibiel $valida cosa contiene?
io vedrei così le classi...
Codice PHP:
class DB{
/*
  devi crearti una classe che faccia da interfaccia tra l'applicativo e la base di dati con opportuni metodi privati e pubblici e decidere se usarli statici o meno...nel mio esempio sono statici
*/
}

class 
Login{
  
//è vero che al momento la classe non è estesa ma devi prevedere il riuso del codice quando
  //sviluppi con la logica OOP altrimenti non avrebbe senso
  
private $username,$password,$errori,$login;
  
  public function 
__construct(){}

  private function 
checkInDB($user$pass){
    if (!
DB::connect("Nome_DB")) return DB::getError();
    
$result DB::execute("la tua query");
    .....
    return 
vero se c'è, falso se non c'è
  
}

  private function 
valida(){}

  public function 
login(){
    if (!
$this->valida())   return false;
    if(
$this->checkInDB($_POST['username'], $_POST['password'])
      
header("Location: ./profile.php");
    else{
      
$this->errori[] = "Ma che cacchio vuoi entrare se non puoi? ^_^"
      
return false;
    }
  }

  public function 
getErrors(){}

praticamente tu all'interno delle implementazioni non devi prevedere la stampa a video di nessuna informazione...devi fare in modo che ogni funzione restituisca un qualcosa. La stessa funzione getErrors, non deve stampare nulla, deve restituire una stringa di errori. è dal codice che invoca tali funzioni che devi prevedere la stampa del messagio di errore. Alcune funzioni critiche, come la connessione a una base di dati, devono prevedere dei sistemi di gestione delle eccezioni.

Detto ciò è probabile che io stia ancora dormendo, quindi se ho dimenticato qualcosa è "normale" ^_^. Il codice messo è una piccola dimostrazione di come lo svilupperei io e, ovviamente, per ragioni di sonno e tempo non è assolutamente completo