Динамически создать переменную члена класса - PullRequest
0 голосов
/ 21 июля 2011

Я пытаюсь настроить свой проект php (Zend Framework) через injection dependence. До сих пор, когда я создавал модель, я передавал table и view (представление базы данных) моей модели следующим образом:

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

Все мои модели расширяют один и тот же класс, который заботится о построении, обработке сообщений и методах получения форм для взаимодействия с моделью.

Теперь мне нужно ввести 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 ]

2 голосов
/ 21 июля 2011

Использовать массивы

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() для имитации свойства-поведения.

0 голосов
/ 22 июля 2011

Пытались ли вы рассмотреть какой-либо правильный ORM, например, Doctrine2.Вы экономите время, чтобы заново изобрести колесо.Doctrine2 легко настроить с помощью ZF, и в сети много информации на случай, если вы застряли.

...