2012-03-15 8 views
0

タイトルには、インクルードファイルからクラス内の変数(連想配列)にアクセスする際に問題があると記載されています。以下は、クラスとインクルードファイルの両方のソースコードです:インクルードファイルから変数にアクセスできません

require("applications/cw_database.php"); 
require("config/dbConfig.php"); 
require("config/appConfig.php"); 

class APP_ASSESMENTS 
{ 
    private $dbObj; 
    private $DisplayOutput = ""; 

    public function __construct($PageParams) 
    { 
     try 
     { 
      $dbObj = new CW_DB($dbConfig['hostname'],$dbConfig['username'],$dbConfig['password'],$dbConfig['name'],$dbConfig['port']); 
     } catch (Exception $e) { 
      throw new ErrorException($e); 
     } 
    } 
... 

他の部分は$ dbConfigとは関係ありません。

/* 
    Testing configuration for MySQL database 
*/ 
$dbConfig['username'] = "phpcoursework"; // changed on demand 
$dbConfig['password'] = "phpcoursework"; // changed on demand 
$dbConfig['hostname'] = "localhost";  // changed on demand 
$dbConfig['name']  = "students";  // changed on demand 
$dbConfig['port']  = 3306;    // default for MySQL 
+0

何らかの方法で '$ dbConfig'をクラスに渡さないと、あなたのクラスはそれが何であるかをどのように知っていると思いますか? Answersは 'global'キーワードを使うことを提案しています。これは可変スペースを汚染し、間違いを簡単に作り出すことができるため、ひどい習慣です。その変数が必要な場合は、コンストラクタに渡します。 –

+0

ファイルをクラスの中に組み込み、変数をグローバルワークとして定義します。 – Tosh

+0

それはあなたに良いデザインのように見える場合は、それを持っています。 –

答えて

0

まず、$dbObjは自動的にクラスのメンバスコープを負いません、それは意志CW_DBのローカルコピーを作成し、__constructが返されたら破棄します。プロパティを明示的に参照する必要があります。

とにかく
$this->dbObj = ... 

globalを使用してグローバル状態他者により示唆されるようになります「仕事」が、あなたは、あなたがそれを行うにはない最高だOOPの慣行を使用している場合。あなた実際にそのオプションは、次の操作を行うことであろう、include()から返すことができます。

// your config file dbConfig.php 
return array(
    'username' => "phpcoursework", 
    'password' => "phpcoursework", 
    'hostname' => "localhost", 
    'name' => "students", 
    'port' => 3306, 
); 

そして、コンストラクタやメソッドを介して、対象物に注入(ここでコンストラクタだ)

class APP_ASSESMENTS 
{ 

    private $dbObj; 

    public function __construct($dbConfig, $PageParams) 
    { 
     $dbObj = new CW_DB($dbConfig['hostname'], $dbConfig['username'], 
      $dbConfig['password'], $dbConfig['name'], $dbConfig['port']); 
     // ... 
    } 

} 

// include() here, will actually return the array from the config file 
$appAssesments = new \APP_ASSESMENTS(include('dbConfig.php'), $PageParams); 

それは、別のレベルを上げることをお勧めします:代わりに、あなたのAPP_ASSESSMENTSクラスから依存関係を取って、データベースオブジェクト自体を注入してください。


$dbObj = new CwDb(include('dbConfig.php')); 
$appAssessments = new AppAssessments($dbObj, $etc, $etc); 

この単純な変更はあなたがCwDbAppAssessmentsから依存関係を削除することができます(また、PascalCaseは、以下のようなAppAssessmentsCwDbクラスの命名の一般的な規則は、あります)。

public function __construct(CwDb $db, $etc, $etc){ 
    $this->db = $db; 
    // ... 
} 

:あなたには、いくつかの理由でCwDbを拡張する場合はその方法は、あなただけのあなたがそうのようなAppAssessmentsコンストラクタを変更することができますAppAssessments

で任意のコードを変更することなく拡張したクラスのインスタンスを渡すことができますこれは、PHP(が有効ですが、依然として有効ですが)のタイプヒントを利用して、最初の引数が常に正しいタイプであることを保証します。

これは、開かれた/閉じられた原理の一部として機能します。クラスは拡張機能には開いているが、変更するには閉じておく必要があります。

+0

オブジェクト自体を注入するとどういう意味ですか?また、提案に感謝します。 – Tosh

+0

@MaDDoC問題はありません:)オブジェクト自体を注入することによって、 'AppAssessments'オブジェクト(*の直前にある可能性があります)のデータベースオブジェクトのインスタンスを作成してから、その代わりにデータベースオブジェクトを渡します。私は表示するように編集します。 – Dan

+0

まあ、私はそれを得るが、ここでは何が起こっているのですか:私は、MVCアーキテクチャを使用してWebアプリケーションを作成しようとしている、私は表示されるページコントローラの新しいインスタンスを作成しているindex.phpを使用する。コントローラー自体もインスタンスを作成するページモデルのインスタンスを作成しますが、これはデータベースのインスタンスです。私はちょっと混乱しています... – Tosh

-1
public function __construct($PageParams){ 
    global $dbConfig; 
    try{ 
     $dbObj = new CW_DB($dbConfig['hostname'],$dbConfig['username'],$dbConfig['password'],$dbConfig['name'],$dbC onfig['port']); 
    } catch (Exception $e) { 
     throw new ErrorException($e); 
    } 
} 

か、$GLOBALS['dbConfig']を使用することができます。 もこれが含まれているファイル(設定/ dbConfig.php)です。

0

アクセスの範囲で使用されます。したがって、変数にアクセスするには、クラス内にファイルを含める必要があります。前述のように、グローバルでは、別のスコープから変数にアクセスすることもできます。しかし、グローバルは慎重に使用する必要があります!ドキュメントを参照してください。

See the manual for more information.

編集:私はそれを明確グローバルは重要な変数のこれらの種類を処理するための良い代替されることはありませんことを確認する必要があり..

関連する問題