Utiliser une classe A dans une classe B

Default
,

Bonjour,

Voila je rencontre un petit problème avec mon code. Je débute en POO mais j'ai des connaissances en PHP, qui je pense me permettent de suivre les cours de POO. Il faut se lancer !

Ce que je fais

Je souhaite utiliser ma classe A (connexion, requêtes base de données) dans ma classe B, C, D...

Ma classe A ressemble à ça :

<?php

class Database{

    private $db_name = '$';
    private $db_user = '$';
    private $db_host = '$$$';
    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;
    }
    ?>

Ce que je veux

Je ne sais pas comment trop m'y prendre pour l'utiliser "proprement" dans mes autres classes. En fait, ce qui me rebute, c'est la connexion. Dans une page PHP, je peux très bien utiliser plusieurs autres classes (membres, appareils...). Qui elles-même feront appel à la classe A.
Je pensais la solution de l'extension (via extends) mais cette architecture n'est-elle pas "réservée" à la modification de la classe parente ?
Je pensais également à instancier la classe A dans une fonction de mes autres classes. Mais, au vu du fonctionnement de la POO, chaque objet est "indépendant". Donc, instancier une connexion sur la classe B, C, D... n'est pas très propre à mon sens. Voyez-vous ce que je veux dire ?
Quelles solutions me conseilleriez-vous ?

PS : Je cherche pas forcément qu'on me ponde un code tout fait... Je suis plutôt à la recherche de conseils... Merci d'avance, et je vous remercie de votre aide ainsi que de vos conseils bienveillants :)

2 Réponse

45633
,

Je te conseil de voir les design pattern d'injection de dépendance et le conteneur d'injecteur de dépendance. En gros tu as raison sur le fait que chaque classe doit être indépendantes :

Voici un exemple de code qui prends en compte l'injection de dépendances :

// Pas de respect du psr pour réduire la taille du code
class Database {
    public function request(string $statement, array $params = []) {}
}

class Repository {
    /** @var Database $db */
    protected $db;

    public function __construct(Database $db) { $this->db = $db; }
}

class UserRepository extends Repository {
    public function findByEmail() { $this->db->request(''); return ''; }
}

class AccountController {
    public function login (UserRepository $userRepository) {
        $user = $userRepository->findByEmail('email');
    }
}

// Cette partie là sera automatique ou presque avec un DIC
$db = new Database();
$userRepository = new UserRepository($db);

$accountController = new AccountController();
$accountController->login($userRepository);

Tu as les design pattern dans la formation php poo de grafikart :
https://www.grafikart.fr/formations/programmation-objet-php

Default
,

Merci, j'ai été voir et ça correspond à mes attentes effectivement. J'ai pourtant vu le tutoriel, il y a déjà un petit moment...
Merci bien quenti77