それを行うにはいくつかの方法があります。グローバル変数は確かに一方向であり、最も軽視されています。 シングルトン を作成できます データベースアクセスを必要とする他のすべてのクラスは、このシングルトンを呼び出します。
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);
}
}
これは、グローバル変数を使用することを超えた開始と大きなステップとしてはすべてうまくいきますが、依存性注入 。依存性注入は、クラスに外部依存関係がある場合(例のデータベース接続など)、コンストラクターまたはメソッドでそれらを必要なクラスに明示的に渡すという単純な概念です。したがって、新しいコードはJonathanのソリューションのようになります。依存性注入を使用する主な利点は、単体テストにあります。この単体テストでは、この実際のデータベースオブジェクトをモックオブジェクトに簡単に置き換えて、必要な人に渡すことができます。
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);
}
}
小規模なプロジェクトの場合は、自分で簡単に行うことができます。大規模なプロジェクトの場合、さまざまなPHPで使用可能なDIフレームワークがあります。