2

小さな問題があります。検索してみましたが、検索語句がうまく当てはまらず、誰か助けてくれることを期待していました。

システムのすべてのページに、次のように機能するインクルードがあります。

<?PHP
require_once("class.system.php");
require_once("class.mysql.php");

$oMySQL = new MySQL();
$oSystem        = new SystemClass();

... ?>

しかし、私には問題があります。ご想像のとおり、MySQL クラスは、MySQL 呼び出しを簡単にするために使用する一連の関数です。これは私が使用したい唯一の例ではありませんが、良い例です。

MySQL クラスを参照できるようにしたいシステム クラスに関数があります (逆もまた同様です...)。

例として、MySQL からのデータをセッション変数に入力するシステム クラスの関数があります。私がこれを行うことを考えることができる唯一の方法(私が知っているのは間違っています...)は次のとおりです。

class SystemClass {

    function PopulateSession(){
         global $oMySQL;
         if($oMySQL->Select('abc')){
             $_SESSION['def']= blahblahblah;
             return true;
         } else {
             return false;
         }
    }
}

それは機能しますが、それは私がそれを使用したいすべての機能を意味します。グローバルを使用する必要があります。これは非常に悪い習慣だと確信しています。誰かがアドバイスできますか??

ありがとう

4

1 に答える 1

3

あなたが遭遇したのは作曲と呼ばれています。良い解決策は、依存性注入フレームワークを使用することです。簡単な解決策は、コンストラクターパラメーターを使用してロールすることです。

public class A { 
  private $b;
  public function __construct($b) {
    $this->b = $b;
  }
}

$b = new B;
$a = new A($b); 

または、より柔軟なソリューションとして、相互依存関係がある場合:

public class A {
  private $b;
  public function setB($b) {
    $this->b = $b;
  }
}

public class B {
  private $a;
  public function setA($a) {
    $this->a = $a;
  }
}

$a = new A;
$b = new B;
$a->setB($b);
$b->setA($a);

ただし、欠点は、依存関係の数が増えるにつれて、すべての依存関係を管理および設定することを忘れないようにすることが難しいことです。これが、依存性注入フレームワークが人気がある理由です。

于 2013-03-06T17:08:56.833 に答える