PHP:如何访问类中的对象

时间:2012-05-31 08:36:48

标签: php oop

我有一个包含公共数据成员的语言课程:

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

5 个答案:

答案 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