Има няколко начина да направите това. Глобалните променливи със сигурност са един от начините и са най-пренебрегвани. Можете да създадете Singleton и всички останали класове, които се нуждаят от достъп до база данни, ще извикат този сингълтон.
final class Database {
private static $connection;
public static function getInstance() {
if(self::$connection == NULL) {
self::$connection = // init your database connection
}
return self::$connection;
}
}
И използвайте този обект за връзка към базата данни във всеки клас, който има нужда от него.
class Application {
public function displayVar() {
echo 'hello world';
}
public function getVar() {
$db = Database::getInstance();
$sql = foo;
$db->query($sql);
}
}
Всичко това е добре за начало и чудесна стъпка отвъд използването на глобални променливи, но можете да направите по-добре с Инжекция на зависимост . Инжектирането на зависимост е проста концепция, че ако даден клас има някакви външни зависимости, като връзката към базата данни във вашия пример, вие изрично ги предавате на нуждаещия се клас в неговия конструктор или метод. Така че новият код ще изглежда нещо като решението на Джонатан. Основно предимство на използването на инжектиране на зависимост е тестването на модули, където можете лесно да замените този действителен обект на база данни с фалшив обект и да го предадете на всеки, който има нужда от него.
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);
}
}
За по-малки проекти можете лесно да го направите сами. За големи проекти има различни DI рамки, налични за PHP