2011-09-27 52 views
1

我想使用此模式在我的代码中启用依赖注入。 我觉得它与动态语言的play-doh本质保持一致[1]。PHP嵌套静态变量访问依赖注入

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

+0

也许这个工程:'$ this-> foo = {self :: $ FOO} :: getInstance();',但我不知道。不过,我不知道这应该是什么样的依赖注入?注入全局状态?会有点多余。 – hakre

+0

所以在这种情况下,我正在使用传统的类似rails的框架,它使用了大量普遍使用的静态类。所以假设我必须调用Foo :: getInstance(),并且我不能彻底替换整个应用程序/测试套件中的Foo(并且我不能更改构造器参数)是否有另一种方法来注入一个实例富? –

+0

$ this-> foo = {self :: $ FOO} :: getInstance()导致“语法错误,意外”{“”这是php 5.3.2 –

回答

1

没有替代的语法来实现此目的。你需要一个临时变量来欺骗分析器。

0

尝试

$class = self::$FOO; 
$this->foo = $class::getInstance();