簡體   English   中英

PHP:如何訪問類內部的對象

[英]PHP: How to access object inside class

我有一個帶有公共數據成員的語言課:

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

然后,我有許多使用此類的不同類。 如何從其他課程中訪問該課程? 您當然可以在使用它的所有類中實例化該對象的一個​​對象,但是我想如果我要使用多個類這樣做會大大降低性能。

我只需要一個對象,因為無論如何我都不會更改它們。 所以,我做了

$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(),我只是傳遞了一個引用,因為我不使用克隆詞?

基本上,您的語言對象是其他對象的依賴項。 您需要考慮許多因素:-性能(每次需要實例化一個新語言對象的明智程度,或者是否有可能)-測試-如果每個類都有一個類,如何測試您的類對您的語言類的硬編碼依賴性-可維護性/可讀性。

有多種解決方案。 在PHP社區中,最流行的一種是依賴注入容器。 如果您處於未開發狀態,這可能是一個很好的解決方案。

馬丁·福勒Martin Fowler) (還有誰?)寫了一篇關於一般主題的好文章。

編輯:為了多解釋一點,本文討論了控制反轉原理。 我不會更深入地解釋它,因為我認為我不能像Martin Fowler一樣做到這一點,但其中的一個小問題是您的類無法管理自己的依賴關系。 這是在其他地方完成的(因此稱為控制反轉)。 大致有兩種不同的實現方式-依賴注入(可能涉及容器也可能不涉及容器)和服務定位器。 馬丁·福勒(Martin Fowler)的文章的這一部分討論了兩者之間的一些區別。

在您的類的構造函數中實例化Language對象:

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

如果您不想擁有此類的實例,請考慮使其屬性和方法設為static

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

然后靜態使用它們:

$error = language::$error;

代替使用全局變量,您可以通過構造函數傳遞它。

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

我只需要一個物體

這是單例模式。

這是一個僅包含您的Language類實例的方法的快速示例:

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

這個依賴注入的示例稱為構造函數注入

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM