Ciao che ne pensate di un approccio del genere
Codice PHP:
<?php
class InvalidArgException extends Exception{
       public function 
__construct($message$code 0){
      
parent::__construct($message$code);
      }
    public function 
__toString(){
       return 
__CLASS__ " Line : [{$this->line}] Code : [{$this->code}] Msg : {$this->message}\n";
       }
}
class 
DbException extends Exception{
       public function 
__construct($message$code 0){
      
parent::__construct($message$code);
      }
    public function 
__toString(){
       return 
__CLASS__ " Line : [{$this->line}] Code : [{$this->code}] Msg : {$this->message}\n";
       }
}
class 
DBFactory{
    private static 
$instance null;
    public static function 
createDB($db,$options){
        if(
$db!='MySQL'&&$db!='SQLite'){
           throw new 
Exception('Invalid type of database class');
         }
        return 
self::getInstance($db,$options);
    }
    private static function 
getInstance($db,$options){
        if(
is_null(self::$instance)){
            
self::$instance = new $db($options);
        }
        return 
self::$instance;
    }
}
abstract class 
DBConnector{
       abstract private function 
connect();
    abstract public function 
close();
}
class 
MySQL extends DBConnector{
    private 
$host=''
    private 
$user=''
    private 
$password=''
    private 
$database='';
    public 
$mysqli=null;
    public function 
__construct($options=array()){
        if(
count($options)<4){
            throw new 
InvalidArgException('Invalid options number in class ['.__CLASS__.']');
        }
        foreach(
$options as $parameter => $value){
            if(empty(
$value)){
                throw new 
InvalidArgException('Invalid parameter.Parameter ['.$parameter.'] is empty in class ['.__CLASS__.']');
            }
            
$this->{$parameter}=$value;
        }
        
$this->connect();
    }
    private function 
connect(){
        
$this->mysqli = @new mysqli($this->host,$this->user,$this->password,$this->database);
        if(
mysqli_connect_errno()){
            throw new 
DbException('Connect failed: '.mysqli_connect_error());
        }
    }
    public function 
close(){
        
$this->mysqli->close();
        
$this->__destruct();
    }
    final public function 
__destruct(){
        unset(
$this->_host);
        unset(
$this->_user);
        unset(
$this->_password);
        unset(
$this->_database);
    }
}
//
class MySQL_query{
    private 
$mysqli=null;
    public function 
__construct(MySQL $msql){
        
$this->mysqli=$msql;
    }
    public function 
query($query){    
        if(!
$this->result=$this->mysqli->mysqli->query($query)){
            throw new 
DbException('Error query : ['.$query.']');
        }
        if(
$this->result instanceof mysqli_result){
            return new 
Result($this->result);
        }
    }
}
class 
Result{
    private 
$result;
    public function 
__construct(mysqli_result $mysqliResult){
        
$this->result $mysqliResult;
    }
    public function 
fetchObject(){
        return 
$this->result->fetch_object();
    }
}
try {
$options=array('host'=>'localhost','user'=>'','password'=>'','database'=>'');
$dbDBFactory::createDB('MySQL',$options);
$query= new MySQL_query($db);
$result$query->query('SELECT * FROM users');
while(
$obj=$result->fetchObject()){
 echo 
$obj->username;
}
$db->close();
}
catch (
InvalidArgException $e) {
    echo 
$e;
    
error_log($e->getMessage()."\n"3$root."/log/error.log");
    exit();
}
catch (
DbException $e) {
    echo 
$e;
    
error_log($e->getMessage()."\n"3$root."/log/error.log");
    exit();
}
?>