1

パブリック データ メンバーを持つ言語クラスがあります。

class language {
    public $error = "There was an error";
}

次に、このクラスを使用するさまざまなクラスがあります。他のクラスからこのクラスにアクセスするにはどうすればよいですか? もちろん、それを使用するすべてのクラス内でそのオブジェクトをインスタンス化することもできますが、複数のクラスでそれを行うと、パフォーマンスが大幅に低下すると思います。

とにかくオブジェクトを変更しないので、必要なオブジェクトは 1 つだけです。だから、私はやった

$language = new language();

class name {
    private $language;

    public function __construct() {
        global $language;
        $this->language = $language;
    }


    public function method() {
        mysql_query(...) or die($this->language->error);
    }
}

これは良い方法ですか?ここで、すべての「マザー」スクリプトでインスタンス化する必要があります。そして、__construct() を実行することで、クローン ワードを使用しないため、参照を渡すだけだと思いますか?

4

5 に答える 5

2

基本的に、言語オブジェクトは他のオブジェクトの依存関係です。考慮しなければならない要素がいくつかあります: - パフォーマンス (必要なたびに新しい言語オブジェクトをインスタンス化することがどれほど賢明か、またはそれが可能かどうか) - テスト - 各クラスが持っている場合にクラスをテストする方法言語クラスへのハードコーディングされた依存関係 - 保守性/可読性。

問題にはさまざまな解決策があります。PHP コミュニティで最も流行しているように見えるのは、依存性注入コンテナーです。これは、グリーンフィールドの状況にある場合に適したソリューションです。

一般的な主題に関する優れた記事は、Martin Fowler による記事です (他に誰がいますか?)。

編集:もう少し説明するために、この記事では制御の反転の原則を扱っています。マーティン・ファウラーのようにうまくやれるとは思えないので、詳しくは説明しませんが、問題は、クラスが独自の依存関係を管理していないことです。これは別の場所で行われます (そのため、制御の反転という名前が付けられています)。これを行うには、大きく 2 つの異なる方法があります。依存性注入 (コンテナーを含む場合と含まない場合があります) とサービス ロケーターです。Martin Fowler の記事のこのセクションでは、この 2 つの違いのいくつかを扱います。

于 2012-05-31T08:45:41.547 に答える
1

クラスのコンストラクターでオブジェクトをインスタンス化しLanguageます。

public function __construct() {
  $this->language = new Language();
}
于 2012-05-31T08:37:58.047 に答える
1

このクラスのインスタンスを持ちたくない場合は、そのプロパティとメソッドを作成することを検討してstaticください。

class language {
    static public $error = "There was an error";
}

次に静的に使用します。

$error = language::$error;
于 2012-05-31T08:40:44.447 に答える
1

グローバル変数を使用する代わりに、コンストラクターを介して渡すことができます。

public function __construct($language) {
    $this->language = $language;
}
于 2012-05-31T08:41:41.247 に答える
1

必要なオブジェクトは 1 つだけです

これがシングルトンパターンです。

Language クラスのインスタンスを 1 つだけ持つ方法の簡単な例を次に示します。

class Language {
  public $error = "text";

  private static $instance = null;

  public static function getInstance() {
    if (self::$instance == null)
      self::$instance = new self();
    return self::$instance;
  }

  private function __construct() {}
}

$lang = Language::getInstance();
$text = $lang->error;

依存性注入を使用することもできます:

interface ILanguage {
  public function getError();
}

class Language implements ILanguage {
  private $error = "error";
  public function getError() {
    return $this->error;
  }
}

class name {
  private $language;

  public function __construct(ILanguage $lang) {
    $this->language = $lang;
  }

   public function method() {
     mysql_query(...) or die($this->language->getError());
   }
}

$language = new Language();
$n = new name($language);

この依存性注入の例は、コンストラクター注入と呼ばれます。

于 2012-05-31T08:43:10.897 に答える