Utiliser une classe A dans une classe B

lze
Petit nouveau ! | 1 Messages

29 avr. 2019, 17:53

Bonjour,

Je me suis créé une classe en PHP nommée Database, qui fonctionne bien de manière indépendante. J'entends par là que si je l'appelle dans un fichier x les requêtes s'effectuent correctement.

Code : Tout sélectionner

class Database{ private $db_name = '$'; private $db_user = '$'; private $db_host = '$-$.privatesql;port=$'; private $db_pass = '$'; protected $pdo; private function getPDO(){ if($this->pdo === null){ $pdo = new PDO('mysql:host='.$this->db_host.';dbname='.$this->db_name.';charset=utf8', $this->db_user, $this->db_pass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->pdo = $pdo; } return $this->pdo; } public function query($statement, $params = null){ $req = $this->prepare($statement); $req->execute($params); $datas = $req->fetchAll(PDO::FETCH_OBJ); return $datas; } ?>
Et, j'aimerai, dans la mesure du possible, utiliser cette classe (donc la connexion à ma base de données) dans d'autres classes. J'aimerai refaire mon site, pour le refaire en "POO", ce qui sera plus lisble pour moi.
Autrement dit, sur une page xxx.php il peut très bien y avoir 3 ou 4 instanciations différentes et toutes, peuvent potentiellement avoir besoin à un accès à la base de données.

En consultant les forums divers, j'ai vu sur certains sujets, qu'ils instanciaient la classe "database" dans classes. Ma question est alors la suivante, dans la mesure où une classe est "indépendante", instancier des nouvelles connexions à chaque classe, ne poserait pas des problèmes de performance ?
D'un oeil débutant en POO, je trouve cette méthode pas très "propre".

Comment le faire proprement ? Merci d'avance, :)

Avatar du membre
Mammouth du PHP | 874 Messages

03 mai 2019, 15:44

Salut, basiquement, si tu veux instancier une seule fois ta classe Database et l'utiliser dans différentes classes sans la ré-instancier, il faut que tu la transmettes à ces classes via leur constructeur ou via une méthode prévue à cet effet.

Après y a moyen de faire des choses beaucoup plus poussées mais c'est pas évident d'expliquer ce qui pourrait être fait par écrit sans se lancer dans l'écriture d'un pavé.

Mais assez simplement, sans trop pousser la chose, tu pourrais ajouter une méthode statique à ta classes Database afin de créer où récupérer son instance (selon qu'elle est déjà instanciée ou pas).
Tu pourrais ainsi faire des Database::getInstance()->query(); depuis n'importe quelle classe sans avoir besoin de transmettre ton instance Database.
C'est le principe du singleton. A noter que toutes les classes utilisant le Database::getInstance() deviendront dépendante de la classe Database.

Ca donne quelque chose dans le genre :
class Database {
  private static $instance = null;

  public static getInstance() {
    if (self::$instance !== null)
      return self::$instance;

    return self::$instance = new Database();
  }
}
J'édite souvent mon message après avoir répondu pour le corriger où y apporter des informations complémentaires alors n'hésitez pas à y jeter un nouveau coup d'oeil ^^