Problème de logique objet

Problème de logique objet - PHP - Programmation

Marsh Posté le 07-11-2006 à 12:36:05    

Bonjour à tous,
 
Je me retrouve face à un problème de logique objet et j'espere que vous allez pouvoir m'aider.
 
J'utilise une couche d'abstraction de base de données composée par plusieurs classes. Une classe abstraite qui contient la définition des mes méthodes et des classes représentant plusieurs SGBD qui héritent de ma classe abstraite.
 
En gros j'ai :
 
abstract class dao
 
class mysql extends dao  
class msql extends dao
class pgsql extends dao
 
J'instancie ensuite la classe enfant correspondante au SGBD que je souhaite utiliser et j'effectue mes requetes , ce qui donne dans le cas de l'utilisation de MySQL :
 
$bdd = new mysql();
$bdd->query('SELECT *  FROM users;');
 
Je souhaiterai maintenant utiliser une classe pour stocker mes requêtes de cette façon :
 
class requete {
 
    function SelectAll($table) {
     
    $sql = 'SELECT *  FROM '.$table;
 
    return $bdd->query($sql);
}
 
Et donc voici mon problème : comment avoir accès à $bdd->query() qui correspond à une méthode de la classe d'abstraction ?
 
En utilisant $bdd->query() dans une fonction j'ai le message d'erreur suivant :
 
Fatal error: Call to a member function on a non-object in...
 
Je pourrais régler le probleme en déclarant la classe requete comme classe fille de mysql mais ça me forcerais d'instancier la classe requete plutôt que mysql et ça me ferais perdre la portabilité du code (il faudrai mettre à jours le fichier de classe pour changer le extends lors d'un changement de SGBD).
 
J'espere avoir bien exprimé mon problème et j'espere que vous pourrez m'eclairer !
 
Cordialement,

Reply

Marsh Posté le 07-11-2006 à 12:36:05   

Reply

Marsh Posté le 07-11-2006 à 12:58:51    

Pourquoi est -ce que tu ne remonte pas tes methodes génériques dans ton objet générique ....
 
Dao ?

Reply

Marsh Posté le 07-11-2006 à 13:07:15    

En faite j'aimerai pouvoir séparer mes requetes de ma classe abstraite afin que ma classe abstraite ne garde que des méthodes necessaire à l'abstraction.
 
Le top serait d'avoir :
 
Ma classe abstraite
          |
          |
          |
Ma classe enfant (en fonction de mon SGBD)
 
Une classe requete parent (contenant des methodes permettant de faire des requetes de base genre select *)
          |
          |
          |
des classes requetes fille (contenant des methodes permettant de faire des requetes complex et instancié en fonction du besoin).
 
Le problème étant de permettre à ma classe requete enfant d'acceder à une méthode de la classe abstraite.
 
PS: pour dao le nom est mal choisi je sais car il porte à confusion mais j'ai mis ça pour l'exemple.

Reply

Marsh Posté le 07-11-2006 à 13:11:16    

Je suis pas reelement d'accord , ton objet abstrait (dao) doit te permettre normalement :  
 
de te connecter / deconnecter à la base  
d'effectuer des requetes "libres"
et d'effectuer des requete "génériques" (comme ton select all)
 
Je vois pas comment faire mieux , vu que dedans tu vas avoir du sql et que le sql ne depend pas du sgbd
 
Moi j'avais deja fait la meme chose en java et ca marchait super bien  
 

Reply

Marsh Posté le 07-11-2006 à 13:18:27    

mwai je suis ok avec toi sur le fond mais ça m'embette car je ne suis pas le seul à avoir accès à la classe abstraite et que je ne veux pas qu'on aille tripatouiller dedant.
 
Enfin c'est assé compliqué à expliquer. Si j'avais le choix c'est ce que je ferais mais la je peux pas trop.
 
Mais ça me parais vraiment bizzard qu'on ne puisse pas accèder à une methode d'une classe depuis une autre classe une fois que la 1ere à été instancié :/

Reply

Marsh Posté le 07-11-2006 à 13:25:13    

ben le probleme c'est que ta classe requete ne connait pas la variable bdd , tu ne lui as pas transmis , je crois

Reply

Marsh Posté le 07-11-2006 à 13:30:08    

j'ai oublié de le préciser mais je lui transmet via le constructeur.
 
class requete {
 
 var $object_name;
 
 function requete($object_name) {
 
  $bdd = $object_name;
 }
 
 function SelectAll($table) {
 
  $sql = 'SELECT *
   FROM '.$table.';';
   
  return $bdd->query($sql);
 }
}


Message édité par gnarkk le 07-11-2006 à 13:30:24
Reply

Marsh Posté le 07-11-2006 à 13:33:33    

Citation :

class requete {  
 
 var $object_name;  
 
 function requete($object_name) {  
   
  $bdd = $object_name;  
 }  
 
 function SelectAll($table) {  
 
  $sql = 'SELECT *  
   FROM '.$table.';';  
   
  return $bdd->query($sql);  
 }  
}


 
Il y a un probleme dans ta classe tu déclares l'objet que tu passes en parametre ($object_name) mais pas l'objet bdd de la classe ?!? c'est normal ?
 
et de plus je crois que c'est un truc du genre $this->bdd->query->($sql) ... ou un truc dans le genre


Message édité par jbourdellon le 07-11-2006 à 13:33:59
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed