Доступ к вложенным статическим переменным PHP для внедрения зависимостей

Я хотел бы использовать этот шаблон, чтобы включить внедрение зависимостей в свой код. Я чувствую, что это согласуется с игровым характером динамических языков [1].

class A {
  static $FOO = 'Foo';
  function __construct() {
    $this->foo = self::$FOO::getInstance();
  }
}

A::$FOO = 'MockFoo';
$a = new A();

К сожалению, это не работает, и я получаю:

Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in [test.php] on line 6

Я могу создать временную переменную, чтобы обмануть синтаксический анализатор, но есть ли другой способ?

function __construct() {
  $FOO = self::$FOO;                                                                                                                                            
  $this->foo = $FOO::getInstance();
}

[1] http://weblog.jamisbuck.org/2008/11/9/legos-play-doh-and-programming


person case nelson    schedule 27.09.2011    source источник
comment
Может быть, это работает: $this->foo = {self::$FOO}::getInstance();, но я не знаю. Однако мне интересно, какой должна быть инъекция зависимостей? Внедрить глобальное состояние? Будет несколько лишним.   -  person hakre    schedule 27.09.2011
comment
Итак, в этом случае я работаю с устаревшей инфраструктурой, похожей на рельсы, которая использует большое количество статических классов, которые используются повсеместно. Итак, предполагая, что мне нужно сделать вызов Foo::getInstance(), и я не могу напрямую заменить Foo во всем наборе приложений/тестов (и я не могу изменить аргументы конструктора), есть ли другой способ внедрить экземпляр Фу?   -  person case nelson    schedule 27.09.2011
comment
$this-›foo = {self::$FOO}::getInstance() приводит к синтаксической ошибке, неожиданной '{' это php 5.3.2   -  person case nelson    schedule 27.09.2011


Ответы (2)


Для этого нет альтернативного синтаксиса. Вам нужна временная переменная, чтобы обмануть синтаксический анализатор.

person case nelson    schedule 04.11.2011

Пытаться

$class = self::$FOO;
$this->foo = $class::getInstance();
person mpartel    schedule 27.09.2011