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