繁体   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