Mysql
 sql >> Database >  >> RDS >> Mysql

Usare correttamente le classi in altre classi in php?

Ci sono un paio di modi per farlo. Le variabili globali sono certamente un modo e anche il più disprezzato. Puoi creare un Singleton e tutte le altre classi che necessitano dell'accesso al database ricorrerebbero a questo singleton.

final class Database {
    private static $connection;

    public static function getInstance() {
        if(self::$connection == NULL) {
            self::$connection = // init your database connection
        }
        return self::$connection;
    }
}

E usa questo oggetto di connessione al database in qualsiasi classe ne abbia bisogno.

class Application {
    public function displayVar() {
        echo 'hello world';
    }
    public function getVar() {
        $db = Database::getInstance();
        $sql = foo;
        $db->query($sql);
    }
}

Tutto questo va bene per cominciare e un ottimo passo oltre l'uso delle variabili globali, ma puoi fare di meglio con Inserimento di dipendenza . L'inserimento delle dipendenze è un concetto semplice per cui se una classe ha dipendenze esterne, come la connessione al database nel tuo esempio, le passi esplicitamente alla classe bisognosa nel suo costruttore o in un metodo. Quindi il nuovo codice assomiglierebbe alla soluzione di Jonathan. Uno dei principali vantaggi dell'utilizzo dell'iniezione delle dipendenze è nello unit test, in cui puoi facilmente sostituire questo oggetto di database effettivo con un oggetto fittizio e passarlo a chiunque ne abbia bisogno.

class Application {
    private $db;

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

    public function displayVar() {
        echo 'hello world';
    }

    public function getVar() {
        $sql = foo;
        $this->db->query($sql);
    }
}

Per progetti più piccoli, puoi farlo facilmente da solo. Per progetti di grandi dimensioni, sono disponibili vari DI frameworks disponibili per PHP