我有一个包含公共数据成员的语言课程:
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()我只传递一个参考,因为我不使用克隆词?
答案 0 :(得分:2)
基本上,您的语言对象是您的其他对象的依赖项。您需要考虑许多因素: - 性能(每次需要时实例化一个新的语言对象是多么明智,或者是否可能) - 测试 - 如果每个类对您的语言类具有硬编码依赖性,您将如何测试您的类 - 可维护性/可读性。
这个问题有各种不同的解决方案。在PHP社区中似乎最流行的是依赖注入容器。如果您处于绿地情况,这可能是一个很好的解决方案。
关于一般主题的好文章是one by Martin Fowler(还有谁?)。
编辑:为了进一步解释,本文讨论了控制反转原理。我不会深入解释它,因为我认为我不能像Martin Fowler那样做,但它的结论是你的课程不管理他们自己的依赖;这是在其他地方完成的(因此称为反转控制)。有两种不同的方法 - 依赖注入(可能涉及或可能不涉及Container)和服务定位器。 Martin Fowler的这篇section文章讨论了两者之间的一些差异。
答案 1 :(得分:1)
在类的构造函数中实例化Language
对象:
public function __construct() {
$this->language = new Language();
}
答案 2 :(得分:1)
如果您不想拥有此类的实例,请考虑使其属性和方法static
:
class language {
static public $error = "There was an error";
}
然后静态使用它们:
$error = language::$error;
答案 3 :(得分:1)
您可以通过构造函数传递它,而不是使用全局变量。
public function __construct($language) {
$this->language = $language;
}
答案 4 :(得分:1)
我只需要一个对象
这是Singleton模式。
以下是一个只有一个语言类实例的方法的简单示例:
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);
此依赖注入示例称为constructor injection。