Ok, alors petit exemple vraiment basique, j'ai fait ça en quelques minutes pour les besoin de l'exemple, mon propre système est trop complexe pour être expliqué rapidement.
D'abord un fichier de configuration, tout ce qu'il y a de simple :
<?php
/**
* Fichier de configuration.
*
* Description du modèle de données
*/
$dbConf = array(
'personnes_per' => array(
'per_id',
'per_nom',
'per_prenom'
),
'telephones_tel' => array(
'tel_id',
'per_id',
'tel_numero',
'tel_type'
)
);
?>
Jusque là, rien de sorcier, on crée un mini annuaire, ma base de données a deux tables, une pour lister le nom des personnes et la seconde pour enregistrer leurs différents numéros de téléphone, que ce soit des fixe ou des portable voire pourquoi pas des fax.
La classe maintenant avec mes Getter/Setter magiques, suis les commentaires, ils devraient être suffisamment explicites :
<?php
/**
* Classe permettant l'accès à n'importe quelle table indiquée
* dans un tableau de configuration.
*/
class accesTable
{
/**
* Nom de la table à laquelle on accède.
*
* @var String
*/
private $_nomTable;
/**
* Description des collones de la table instanciée.
*
* @var Array
*/
private $_conf;
/**
* Constructeur.
*
* Définit le nom de la table qu'on veut consulter en
* initialisant son nom et la liste de ses collones.
*
* @param String $nomTable
* @param Array $conf
*/
public function __construct($nomTable, $conf)
{
/* On initialise la configuration */
$this->_nomTable = $nomTable;
$this->_conf = $conf[$nomTable];
/**
* On lance la construction de la table en déterminant quelles
* colonne on peut utiliser.
*/
$this->_init();
}
/**
* Setter magique.
*
* Assigne une valeur à une collone à condition que celle-ci
* existe dans la configuration.
*
* @param String $colonne Nom de la colonne
* @param String $valeur Valeur à affecter à la colonne
* @throws Exception Si la colonne n'existe pas dans la table, on lève une exception
*/
public function __set($colonne, $valeur)
{
if(in_array($colonne, $this->_conf))
{
$this->{$colonne} = $valeur;
}
else
{
throw new Exception("La collone ". $colonne ." n'existe pas dans la table ". $this->_nomTable, E_USER_WARNING);
}
}
/**
* Getter magique.
*
* Vérifie l'existence de la colonne dans la table et en retourne la
* valeur courante si elle a été assignée.
*
* @param String $colonne Nom de la colonne
* @return String
* @throws Exception Si la colonne n'existe pas dans la table, on lève une exception
*/
public function __get($colonne)
{
if(in_array($colonne, $this->_conf))
{
return($this->{$colonne});
}
else
{
throw new Exception("La collone ". $colonne ." n'existe pas dans la table ". $this->_nomTable, E_USER_WARNING);
}
}
/**
* Initialisation des propriétés dynamiques de l'instance.
*
* Pour la table définie dans le constructeur, on crée une propriété
* dynamiquement pour chaque colonne existant dans la configuration de
* la table. La méthode est privée et déclenchée par le constructeur.
*/
private function _init()
{
foreach($this->_conf as $collone)
{
$this->{$collone} = null;
}
}
}
Si ça va toujours, note quand même qu'il manque des méthodes, en particulier la connexion et les méthodes d'accès à la base, mais l'idée de base, c'est une unique classe pour n'importe quel nombre de tables.
Comment utiliser ça :
<?php
/**
* On veut créer une nouvelle ligne dans la table personne par exemple :
*/
$oPersonne = new accesTable('personne_per', $dbConf['personne_per']);
/* On va maintenant enregistrer des valeurs */
$oPersonne->per_nom = 'Tartempion';
$oPersonne->per_prenom = 'Julot';
/* On tente d'alimenter une propriété inexistante */
$oPersonne->qualite = 'caractériel';
Et de fait, la dernière tentative d'utilisation du set magique me retourne une exception définie dans le __set() puisque per_qualite n'est pas une colonne de la table personne_per.
Tu peux maintenant imaginer un système pour ajouter une méthode save(), ou encore pour effectuer d'autres opérations, tu pourrais peaufiner le tableau de configuration en indiquant les types, les longueurs, les colonnes autorisant les valeurs NULL, etc... et bien entendu il faudrait dans ce cas adapter les méthodes à partir des informations dont tu disposes.
Est-ce que c'est plus clair comme ça ?