Existuje několik způsobů, jak toho dosáhnout. Globální proměnné jsou jistě jedním ze způsobů a také se na ně nejvíce pohlíží s despektem. Můžete vytvořit Singleton a všechny ostatní třídy, které potřebují přístup k databázi, by tento singleton využily.
final class Database {
private static $connection;
public static function getInstance() {
if(self::$connection == NULL) {
self::$connection = // init your database connection
}
return self::$connection;
}
}
A použijte tento objekt připojení k databázi v jakékoli třídě, která to potřebuje.
class Application {
public function displayVar() {
echo 'hello world';
}
public function getVar() {
$db = Database::getInstance();
$sql = foo;
$db->query($sql);
}
}
To vše je dobré pro začátek a skvělý krok za hranice používání globálních proměnných, ale můžete to udělat lépe s Dependency Injection . Dependency Injection je jednoduchý koncept, že pokud má třída nějaké externí závislosti, jako je připojení k databázi ve vašem příkladu, explicitně je předáte potřebné třídě v jejím konstruktoru nebo metodě. Nový kód by tedy vypadal asi jako Jonathanovo řešení. Hlavní výhodou použití vkládání závislostí je testování jednotek, kde můžete tento skutečný databázový objekt snadno nahradit falešným objektem a předat jej komukoli, kdo to potřebuje.
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);
}
}
U menších projektů to snadno zvládnete sami. Pro velké projekty existují různé rámce DI dostupné pro PHP