Quelle est la meilleure façon d'abstraction de la base de données à partir d'une application PHP?

Ma question est comment fait un résumé d'une connexion de base de données de la couche modèle d'une application? La préoccupation principale est d'être en mesure de modifier facilement à partir de différents types de bases de données. Peut-être que vous commencez avec un fichier plat, délimitée par des virgules de la base de données. Ensuite, vous voulez passer à une base de données SQL. Puis, plus tard vous décidez LDAP mise en œuvre serait mieux. Comment une personne peut facilement planifier quelque chose comme cela?

Pour un exemple simple, imaginons que vous disposez d'un utilisateur avec un nom, prénom et email. Très simple à une classe PHP qui la représente peut ressembler à ceci (s'il vous plaît ignorer les problèmes avec le service public de variables d'instance):

<?php

class User {
  public $first;
  public $last;
  public $email;
}

?>

J'ai souvent vu où les gens ont une classe DAO qui a le SQL intégré en tant que tel:

<?php

class UserDAO {
  public $id;
  public $fist;
  public $last;
  public $email;

  public function create( &$db ) {
    $sql = "INSERT INTO user VALUES( '$first', '$last', '$email' )";
    $db->query( $sql );
  }
}

?>

Mon problème avec des stratégies comme c'est quand que vous souhaitez modifier votre base de données, vous devez modifier chaque classe DAO " créer, mettre à jour, de charger, de supprimer les fonctions de traiter avec votre nouveau type de base de données. Même si vous avez un programme d'auto-générer pour vous (dont je ne suis pas particulièrement un fan de), vous devez modifier ce programme pour le faire fonctionner maintenant.

Quelles sont vos suggestions pour savoir comment gérer cela?

Mon idée est de créer une super-classe pour les objets DAO avec sa propre création, suppression, mise à jour, la charge de fonctions. Cependant, ces fonctions devraient prendre tableaux des attributs de la DAO et de générer la requête elle-même. De cette manière, la seule SQL est dans le SuperDAO de classe plutôt que d'être dispersés sur plusieurs classes. Alors si vous vouliez changer votre couche de base de données, vous n'avez qu'à changer la façon dont le SuperDAO classe génère les requêtes. Avantages? Les inconvénients? Prévisible des problèmes? Le bon, la brute et le truand?