【问题标题】:Dynamically build a class member variable动态构建类成员变量
【发布时间】:2011-07-21 13:22:01
【问题描述】:

我正在尝试通过injection dependence 设置我的 php(Zend 框架)项目。到目前为止,当我实例化一个模型时,我会像这样将tableview(数据库视图)传递给我的模型:

$table = new My_Table();
$view = new My_View();
$model = new My_Model($table, $view);

我所有的模型都扩展了一个相同的类,该类负责表单与模型交互的构造、消息处理和 getter。

现在我必须将model 注入model,并且我正在寻找一种被动的静态方式来执行此操作。在我的模型的父类中,我添加了一个静态方法inject,它在应用程序引导程序中被调用。我以key => value 的形式传递了两个字符串,其中键是必须在模型中创建的变量的名称,值是表示要实例化的类的字符串。

My_Model::inject('dependentModel', 'My_Other_Model')

当我尝试通过以下代码将密钥用作新成员变量时,就会出现问题:

protected function _initDependency()
{
    $this->_table = null;

    foreach (self::$_staticDependency as $key => $dependency) {
        $varName = '_' . $key;
        $this->{$$varName} = new $dependency();
    }
}

我收到以下消息

Notice: Undefined variable: _dependentModel

如果知道我想创建模型而不知道它们的依赖关系,那么实现这一目标的最佳方法是什么?

【问题讨论】:

  • $this->{$varName} = new $dependency();

标签: php zend-framework dependency-injection


【解决方案1】:

使用数组

class Foo {
  private $_data = array();


  protected function _initDependency()
  {
    $this->_table = null;

    foreach (self::$_staticDependency as $key => $dependency) {
      $varName = '_' . $key;
      $this->_data[$varName] = new $dependency();
    }
  }
}

(作为副作用,这也删除了变量)

您可以使用__get()__set()__isset()__unset() 来模拟属性行为。

【讨论】:

  • 感谢您的回答,部分内容会很有用。我有一个循环类实例化问题,所以我想我会使用factory/builder 模式
【解决方案2】:

您是否尝试过考虑任何合适的 ORM,例如 Doctrine2。您可以节省自己重新发明轮子的时间。 Doctrine2 使用 ZF 很容易设置,网上有很多信息,以防您遇到困难。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 2010-10-22
    相关资源
    最近更新 更多