2012-04-13 6 views
2

これは私の一般的なPHPのページです:includes.php以前に他のクラスで宣言されたオブジェクトを使用し

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

私はcms.class.php

で指定されたクラスで使用すると呼ばれる$ DBが開始され、プロのオブジェクト

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); 

どのように私は私の資格情報が保存されている複数の場所がなくても、私のクラスでは、このデータベース・オブジェクトを使用できますか?

+0

あなたのクラスにcmsクラスのコンストラクタを使って '$ db'オブジェクトを注入するか、渡すレジストリオブジェクトを持っています。 –

+0

それは完全なincludes.phpですか?何か「インライン」が実行されることは私の理解です。したがって、$ dbにアクセス可能である必要があります。 – kevingreen

答えて

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に入れてください。

+0

これは素晴らしい解決策のように聞こえます。新しいクラス構造の$ dbオブジェクトの '単純な'注入と比較して、たくさんのコードがあります。 $ dmに何を追加できますか?拡張コードを「価値ある」場所にするだけですか?良いロギング機能を追加するのは良い場所ですか? dmで追加できる例がありますか? – stUrb

+1

_resource_のようなものです。データベース(明らかに)。ロガー(通常は設定があり、_this_ファイルに書き込むか、_that_アドレスにメールする)。セッションマネージャなど。オブジェクトを1つ作成してデータベースに渡すだけで済むようにすると、コードがたくさんありますが、アプリケーションが複雑な場合はすぐに償却されます。基本的に '実行する'ファイルはこのブートストラップファイルだけです。他のすべてのファイルはクラスでなければなりません。 – Halcyon

1

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

第1の方法である注射は、人気が高まっています。注入とは、クラスに$ dbを供給することを意味します。あなたはこのようなことをすることができます。

注入:あなたはCMSのクラスを構築する際

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; 
    } 
} 

は今、あなたはそれを介してアクセス可能な変数$ db渡す - > DBが、インスタンスが1つしかありません。

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

グローバル:グローバルが、一般的に眉をひそめているので

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

この方法では人気を失っていると、あなたは$デシベルを必要とするすべての機能でそれを宣言する必要があります。

あなたの質問に関連する他の良い答えがあります。 How can I use "Dependency Injection" in simple php functions, and should I bother?

関連する問題