Det finns ett par sätt att göra det på. Globala variabler är verkligen ett sätt och det mest nedvärderade också. Du kan skapa en Singleton och alla andra klasser som behöver databasåtkomst skulle anlita denna singelton.
final class Database {
private static $connection;
public static function getInstance() {
if(self::$connection == NULL) {
self::$connection = // init your database connection
}
return self::$connection;
}
}
Och använd det här databasanslutningsobjektet i vilken klass som helst.
class Application {
public function displayVar() {
echo 'hello world';
}
public function getVar() {
$db = Database::getInstance();
$sql = foo;
$db->query($sql);
}
}
Det här är bra för en början och ett bra steg längre än att använda globala variabler, men du kan bli bättre med Dependency Injection . Dependency Injection är ett enkelt koncept att om en klass har några externa beroenden, såsom databasanslutningen i ditt exempel, skickar du dem explicit till den behövande klassen i dess konstruktor eller en metod. Så den nya koden skulle se ut ungefär som Jonathans lösning. En stor fördel med att använda beroendeinjektion är i enhetstestning, där du enkelt kan ersätta detta faktiska databasobjekt med ett skenobjekt och skicka det till den som behöver det.
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);
}
}
För mindre projekt kan du enkelt göra det själv. För stora projekt finns det olika DI-ramverk tillgängliga för PHP