2011-09-27 5 views
1

이 패턴을 사용하여 내 코드에서 종속성 삽입을 사용하고 싶습니다. 나는 역동적 인 언어의 플레이 -도 (play-doh) 성질을 계속 유지한다고 생각한다.의존성 주입을위한 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

그래서이 경우 필자는 광범위하게 사용되는 많은 수의 정적 클래스를 사용하는 레거시 레일즈 형 프레임 워크로 작업하고 있습니다. 그래서 Foo :: getInstance()를 호출해야한다고 가정하고 앱/테스트 스위트 전체에서 Foo를 완전히 바꿀 수는 없습니다 (그리고 생성자 args를 변경할 수 없습니다). 인스턴스를 삽입하는 다른 방법이 있습니다. 푸? –

+0

$ this-> foo = {self :: $ FOO} :: getInstance()는 "구문 오류, 예상치 못한 '{'"this is php 5.3.2 –

답변

1

이를 위해 대안 구문 없다보십시오. 파서를 속이려면 임시 변수가 필요합니다.

0

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