动态构建类成员变量

时间:2011-07-21 13:22:02

标签: php zend-framework dependency-injection

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

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

我的所有模型都扩展了一个Same类,它负责表单的构造,消息处理和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

实现这一目标的最佳方法是什么,因为我知道我想创建我的模型对其依赖项的无知?

2 个答案:

答案 0 :(得分:2)

使用数组

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()来模拟属性行为。

答案 1 :(得分:0)

您是否尝试过像Doctrine2这样的正确ORM。你可以省时间重新发明轮子。使用ZF可以很容易地设置Doctrine2,如果你遇到困难,网上会有很多信息。