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 :

Réutiliser une connexion SQL dans plusieurs classes


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2007
    Messages : 108
    Par défaut Réutiliser une connexion SQL dans plusieurs classes
    Bonjour,

    Comment réutiliser une connexion SQL dans une classe. Il y a certes les variables globales mais je me refuse à cette idée !
    Donc, j'initialise ma connexion SQL puis je transmet l'instance au constructeur de la classe.
    Je vous donne un tout petit bout de code, pour comprendre.
    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
    class MaClasse
    {
    	private $sqlLink;
     
    	public function __construct($dbLink)
    	{
    		$this->sqlLink=$dbLink;
    	}
     
    	public function show()
    	{
    		$sqlData=$this->sqlLink->query("SELECT col FROM toto WHERE 1");
    	}
    	...
    }
     
    // Connexion au serveur de la base de données et selection de la base
    $sqlLink = new mysqli(SQL_HOST,SQL_USER,SQL_PASS,SQL_BASE);
    if(!$sqlLink) die("Impossible de se connecter à la base de données !!!");
     
    // Initialisation des classes
    $myvar=new MaClasse($sqlLink);
    Un ami me dit que cette methode donne un code peu lisible et que ma classe n'est pas
    indépendante !
    Lui me conseille d'utiliser les singletons ou d'initialiser la connexion SQL dans le constructeur, comme ceci :
    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
    class MaClasse
    {
    	private $sqlLink;
     
    	public function __construct($dbLink)
    	{
    		$sqlLink = new mysqli(SQL_HOST,SQL_USER,SQL_PASS,SQL_BASE);
    		if(!$sqlLink) die("Impossible de se connecter à la base de données !!!");
    	}
     
    	public function show()
    	{
    		$sqlData=$this->sqlLink->query("SELECT col FROM toto WHERE 1");
    	}
    	...
    }
     
    // Initialisation des classes
    $myvar=new MaClasse();
    Cela sucite plusieurs questions chez moi.

    1. Qu'est ce que les signeton ?
    Bien que je sois en phase de recherche la dessus, je suis preneur de vos connaissances

    2. Pourquoi mon code est-il peu lisible (s'il l'est) ?
    3. Classe indépendante ?
    Un quoi une classe doit elle être indépendante ? c'est une recommandation de PHP ? un code de "bonne pratiques" ?

    4. Une connexion SQL par classe ... est ce bien raisonnable ?
    Donc si mon script comporte 4 classes et que chacune d'elle utilise une connexion SQL, cela va signifier (pour moi) que chaque fois que le script est lancé, il y aura 4 connexions ouvertes sur le serveur SQL ... mon ami me dit que non !
    Pourquoi ?

    N'ayant pas la science (de PHP ) infuse, je suis prêt a me remettre en question dans le but de produire un "meilleur" code. Mais je préfère me baser sur plusieurs avis qu'un seul !

    Merci pour votre avis, conseils et autre

  2. #2
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 333
    Par défaut
    Voila exactement ce qu'il ne faut pas faire !
    ce code fait que MaClasse est dépendante de mysqli

    Ton code précédent rendait plus indépendante MaClasse car nulle part, tu n'indiquais le type de la classe "mysql" (pas le mot en dur "musqli").
    Avec ton code tu peux passer de mysql a mysqlnd, mysqli sans changer le moindre code dans le constructeur de MaClasse, donc le constructeur de MaClasse n'est pas dépendant

    De + on remplace (souvent) par des interfaces les classes pour + d’indépendance, on utilise aussi maintenant l'IoC.

    Cette indépendance au niveau du code, permettent d’inter changer les classes entre elles ! Mais surtout de ne pas tout réécrire en cas de modification d'une seule classe : pas d'effet boule de neige



    Citation Envoyé par elekaj34 Voir le message
    1. Qu'est ce que les signeton ?
    Bien que je sois en phase de recherche la dessus, je suis preneur de vos connaissances
    La classe ne peut s’instancier qu'une seule fois : un seul et unique objet, pas possible de le dupliquer.



    Citation Envoyé par elekaj34 Voir le message
    4. Une connexion SQL par classe ... est ce bien raisonnable ?
    Il ne doit avoir normalement qu'une seule connexion SQL, d'ou tres souvent le choix du singleton : uniquement un seul objet donc une seule connexion.

    A noter qu'utiliser le singleton pour une portée générale est la mauvaise méthode !! (utilisé par beaucoup de framework, de code ici)
    Car tout objet qui utilise alors ce singleton est dépendant de ce singleton.


    Oui, je sais c'est compliqué

  3. #3
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2007
    Messages : 108
    Par défaut
    OK donc j'avais une méthode pas si mauvaise que çà

    Donc on est bien d'accord, pour utiliser dans une classe A une mathode de la classe B je suis obligé de passer l'instance de la classe A au constructeur de la classe B (comme dans mon premier exemple)

    Juste pour info, y a t-il une méthode plus "simple" (sans utiliser les globales bien sur) ou a préférer plus que la mienne ?

    Pour le singleton, c'est ce que j'avais cru comprendre au fil de mes lectures, mais je ne saisi pas comment cela se met en oeuvre

  4. #4
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 333
    Par défaut
    Pour le singleton ai trouvé ca mais avec pdo :
    http://www.developpez.net/forums/d12...ton-pdo-class/
    mais avec une recherche sur le site...

    Mais attention, je le répète, on ne doit pas utiliser le singleton pour sa portée globale :
    dans une méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $db=MonSingleton::query("select")
    notre méthode devient dépendante de "MonSingleton" .
    Bonne méthode: On passe l'instance par le constructeur .

    Donc on est bien d'accord, pour utiliser dans une classe A une méthode de la classe B je suis obligé de passer l'instance de la classe A au constructeur de la classe B (comme dans mon premier exemple)
    YES

    Juste pour info, y a t-il une méthode plus "simple" (sans utiliser les globales bien sur) ou a préférer plus que la mienne ?
    + simple non

    Sinon il faut utiliser des systèmes relativement compliqués : voir "Injection de dépendance", "IoC";

  5. #5
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2007
    Messages : 108
    Par défaut
    OK merci pour tout.

  6. #6
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 104
    Par défaut
    Citation Envoyé par papajoker Voir le message
    Sinon il faut utiliser des systèmes relativement compliqués : voir "Injection de dépendance", "IoC";

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 30/01/2015, 17h22
  2. class perso pour une connexion à SQL server
    Par le_binr dans le forum VB.NET
    Réponses: 7
    Dernier message: 20/03/2012, 16h37
  3. Réponses: 4
    Dernier message: 02/04/2010, 15h39
  4. Réponses: 0
    Dernier message: 05/10/2009, 17h25
  5. publier une connexion sql dans un project !
    Par coucoulido dans le forum Accès aux données
    Réponses: 3
    Dernier message: 26/02/2007, 13h12

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