1

我有一个带有公共数据成员的语言类:

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() 我只是传递一个参考,因为我不使用克隆词?

4

5 回答 5

2

基本上,您的语言对象是其他对象的依赖项。您需要考虑许多因素: - 性能(每次需要时实例化一个新的语言对象是多么明智,或者这是否可能) - 测试 - 如果每个类都有,您如何测试您的类对您的语言类的硬编码依赖 - 可维护性/可读性。

该问题有多种不同的解决方案。在 PHP 社区中似乎最流行的一种是依赖注入容器。如果您处于未开发状态,这可能是一个很好的解决方案。

一篇关于一般主题的好文章是Martin Fowler的一篇(还有谁?)。

编辑:为了解释更多,这篇文章涉及控制反转原理。我不会深入解释它,因为我认为我不能像 Martin Fowler 一样做到这一点,但关键是你的类不管理它们自己的依赖关系;这是在其他地方完成的(因此称为控制反转)。大致有两种不同的方法 - 依赖注入(可能涉及也可能不涉及容器)和服务定位器。Martin Fowler 文章的这一部分处理了两者之间的一些差异。

于 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

我只需要一个对象

这就是单例模式。

这是一个只有一个 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);

这个依赖注入的例子称为构造函数注入

于 2012-05-31T08:43:10.897 回答