IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[POO] Appels Dynamiques à des classes


Sujet :

Langage PHP

  1. #1
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718
    Par défaut [POO] Appels Dynamiques à des classes
    Bonjour à tous, j'essaye actuellement de creer une bete classe php qui doit gerer plusieurs SGBD. Pour cela, j'ai une architecture comme cela :
    - Classe Database (Généraliste)
    * Classe MySQL heritant de Database
    * Classe PostgreSQL heritant de Database
    ...

    Seul probleme, j'aurai aimer faire qu'il y ai le moins de chose possible à modifier lorsque l'on veux ajouter un sgbd.

    Voici quelques variables dans ma classe Database :
    $handle : Correspond à l'identifiant de la connexion à la bdd (apres un connect)
    $sgbd : Contient le nom de la classe du SGBD utilité.

    Au début, j'ai voulu faire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->handle = $this->sgbd::connect($login, $password, $database);
    Bien evidemment (et malheureusement pour moi), cela n'a pas fonctionné et j'ai eu le droit à ma premiere erreur php en hebreux
    unexpected T_PAAMAYIM_NEKUDOTAYIM
    J'ai donc cherché et trouver ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->handle = call_user_func_array(array($this->sgbd, "connect"), array($host, $login, $password, $database));
    Qui fonctionne tres bien pour appeler une methode (fonction) statique.

    Probleme : Lorsque je veux executer une requete, il me retourne une erreur :
    Using $this when not in object context
    Correspondant à cette ligne : (methode non statique)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->last = call_user_func_array(array($this->sgbd, "query"), array($rqt, $this->handle));
    Pour palier à ce probleme, j'aurai voulu instancer la classe du SGBD utilisé (MySQL par exemple).
    Mais impossible d'utiliser l'une ou l'autre des methodes décrites au dessus. J'aurai voulu savoir si il y avait un autre moyen que le switch case... qui m'embetterai serieusement.

    J'espere avoir été assez clair.

    Merci d'avance,

    Korko Fain

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 410
    Points : 15 779
    Points
    15 779
    Par défaut
    cer ne sont que des petits problèmes de syntaxe objet qui seront vite résolus mais d'abord il nous faudrait plus d'informations sur la façon dont tu souhaites utiliser ces objets
    je suppose que si tu as plusieurs type de base de données, par exemple "bdd1" qui est du type MySQL et "bdd2" qui est du type PostgreSQL tu voudras ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $bdd1 =& Database::connexion('bdd1');
    $bdd2 =& Database::connexion('bdd2');
     
    $bdd1->requete('SELECT * FROM table WHERE 1');
    $bdd2->requete('SELECT * FROM table WHERE 1');
    petite parenthèse : est ce que tu sais que ce genre d'objet existe déjà sous différentes formes, par exemple pour PHP 4 tu as des librairies PEAR (http://pear.php.net/package/MDB2) et pour PHP 5 tu as des fonctions PDO intégrées qui font un peu la même chose (http://php.net/pdo)

  3. #3
    Membre éclairé
    Avatar de genova
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 487
    Points : 790
    Points
    790
    Par défaut
    Salut,
    tu ne peux pas utiliser le mot clef $this dans une méthode statique, ça n'a pas de sens. Pour utiliser le mot clef $this tu dois créer une instance de ta classe.

    Ce que tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    abstract class Database
    {
       abstract public function connect($host, $login, $password, $dbname);
       abstract public function query($sql);
    }
     
    class Mysql extends Database
    {
       public function connect($host, $login, $password, $dbname)
       {
       }
     
       public function query($sql)
       {
       }
    }
     
    class Postgresql extends Database
    {
       public function connect($host, $login, $password, $dbname)
       {
       }
     
       public function query($sql)
       {
       }
    }
    Et pour les instances deux choix faciles possibles :
    1) Soit tu définis une méthode statique dans ta classe abstraite Database, comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
       static function method($layer, $host, $login, $password, $dbname)
       {
          if (!class_exists($layer))
          {
             trigger_error('La couche ' . $layer . ' n\'existe pas');
          }
          return (new $layer($host, $login, $password, $dbname));
       }
    et tu peux ensuite faire dans ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $db = Database::method('Mysql', 'localhost', 'root', '', 'dvpcom');
    2) Ou bien tout simplement dans ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $layer = 'Mysql'; // Que tu peux mettre en dur dans un fichier de conf
    $db = new $layer('Mysql', 'localhost', 'root', '', 'dvpcom');
    Généralement je procède comme ça.

  4. #4
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718
    Par défaut
    La classe Database n'est pas statique. C'est justement son intéret. Le principe était de définir dans la classe Database la sur-classe qui définisait les appels à la base de donnée (query, fetch_object etc). Ainsi, dans l'initialisation de Database, je lui entrai le nom de sa super_classe (classe qui hérite de Database) correspondant au type de la base de donnée.

    Seule cette super_classe était statique. C'est justement là que je ne comprenai pas pourquoi il me refusait l'appel de $this-> alors que j'était dans la classe Database et donc dans une classe instanciée et non statique.

    Ton systeme est pas mal Génova mais je trouve que l'appel perpetuel à la variable qui contient le type de la base de donnée surcharge inutilement le script. Alors que si l'instance n'est fait qu'une seule fois, il n'est pas nécéssaire de repréciser le type de la base de donnée à chaque fois (on ne change pas de base de donnée toutes les 5 secondes).

    En fait mathieu, mon appel correspondrait plus à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $bdd1 = new Database('MYSQL', $host, $login, $pass, $db);
    $bdd2 = Database('PGSQL', $host, $login, $pass, $db);
     
    $bdd1->requete('SELECT * FROM table WHERE 1');
    $bdd2->requete('SELECT * FROM table WHERE 1');
    $bdd1 appelerai la classe définie par la constante MYSQL et $bdd2 appelerai la classe définie par la constante PGSQL. (appel la fonction constant())

    Je prend des informations sur les PDO.

Discussions similaires

  1. Appel dynamique des classes [Reflection]
    Par chental dans le forum Qt
    Réponses: 7
    Dernier message: 23/11/2009, 07h07
  2. conception d'un appel dynamique aux classes
    Par Choupinou dans le forum Langage
    Réponses: 2
    Dernier message: 19/04/2007, 09h09
  3. [POO] Problème héritage des classes PHP4
    Par zana74 dans le forum Langage
    Réponses: 2
    Dernier message: 15/08/2006, 16h00
  4. Modifier dynamiquement des class
    Par titou250 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 03/08/2006, 14h15
  5. [POO] Variable Dynamique de Classe
    Par CNoob dans le forum Langage
    Réponses: 5
    Dernier message: 31/01/2006, 22h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo