Есть несколько способов сделать это. Глобальные переменные - это, конечно, один из способов, и на большинство тоже смотрят свысока. Вы можете создать 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);
}
}
Это все хорошо для начала и отличный шаг по сравнению с использованием глобальных переменных, но вы можете добиться большего успеха с Dependency Injection . Внедрение зависимостей - это простая концепция, согласно которой, если у класса есть какие-либо внешние зависимости, такие как соединение с базой данных в вашем примере, вы явно передаете их нуждающемуся классу в его конструкторе или методе. Таким образом, новый код будет выглядеть как решение Джонатана. Основное преимущество использования внедрения зависимостей заключается в модульном тестировании, где вы можете легко заменить этот фактический объект базы данных фиктивным объектом и передать его тому, кто в нем нуждается.
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