2

これは私の一般的なphpページです:

<?php
require_once('includes.php');
require_once('cms.class.php');
.....
rest of the page
?>

includes.php指定されたクラスで使用したい $db というプロオブジェクトで開始されますcms.class.php

includes.php:

$db = new PDO('mysql:host=localhost;dbname=xxxxx','xxxxx','xxxxxx'); 
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

資格情報を保存する複数の場所を持たずに、クラスでこのデータベース オブジェクトを使用するにはどうすればよいですか?

4

2 に答える 2

3

依存関係マネージャーまたはブートストラップ、またはそれを呼びたいものは何でも必要 です

class Dependency_Manager {

    private $db;

    public function __construct($settings) {
        $this->db = new PDO('mysql:host=localhost;dbname=' . settings["dbname"],settings["username"],$setings["password"]); 
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
        $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    }

    public function getDB() {
        return $db;
    }

}

class CMS {
    public function __construct(PDO $db) {
        /* .. */
    }
}

$setting = array(/* etc */);

$dm = new Dependency_Manager($settings);
$cms = new CMS($dm->getDB());

このアプローチは非常にうまくスケーリングされ、あらゆる依存関係を処理できます。また、すべての設定を 1 か所にまとめることを目的としているため、構成設定があちこちに散らばることはありません。設定を知っているの$dmは だけです。設定に基づいて何かを作成する必要がある場合は、 に入れます$dm

于 2012-04-13T18:35:14.580 に答える
1

これには 2 つの方法があります。

最初の方法である注射は、人気が高まっています。インジェクションとは、クラスに $db を提供することを意味します。このようなことができます。

注入:

class CMS_class {
  protected static $db;

  public function __construct($db) {
    if ( ! isset(self::$db))
      self::$db = $db;
  }

  public function __get($name) {
    if ($name === 'db')
      return self::$db;
  }
}

ここで、CMS クラスを構築するときに、->db 経由でアクセスできる $db 変数を渡しますが、インスタンスは 1 つしかありません。

2 番目の方法は、使用するすべての関数でグローバルに呼び出すことです。

グローバル:

class CMS_class {
  function hello_world() {
    global $db;
    var_dump($db);
  }
}

グローバルは一般的に嫌われており、$db が必要なすべての関数で宣言する必要があるため、この方法は人気を失いつつあります。

あなたの質問に関連する他の良い答えがあります。 簡単なphp関数で「依存性注入」を使用するにはどうすればよいですか?

于 2012-04-13T18:38:39.380 に答える