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