[英]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.