2009-07-26 3 views
1

나는 새로운 것을 배우면서 끊임없이 코드를 되돌아보고 내 자신의 이익을 위해 잠시 동안 내 작은 프레임 워크로 작업 해왔다. 예상대로, 나는 거의 모든 다른 객체에 의해 사용되는 Registry 객체를 가지고있다.싱글 톤과 상호 작용하는 가장 효율적인 방법은 무엇입니까?

은 현재, 가장 기본적인 객체 (AFObject는) 그래서 모든 개체가 이제 레지스트리에의 로컬 참조를 포함 할이

absract class AFObject { 

    var $_registry; 

    function __construct(){ 
     $this->_registry = AFRegistry::getInstance(); 
    } 

} 

처럼 약간 설정되어 있습니다. 그래서 내가 한 번에 인스턴스화 된 수백 개의 객체를 가지고 있다면, 그것은 싱글 톤에 대한 수백 가지 참조입니다. 그러나 ... 더 또는 덜 효율적 항상 직접이 같은 레지스트리를 참조하는 것입니다

class AFRouter extends AFObject { 

    function someMethod($bar){ 
     AFRegistry::$foo = $bar; 
    } 

} 
+2

PHP 5의 var 키워드 대신 public, protected 또는 private을 사용해야합니다. –

답변

0
나는 100 참조 정말 문제가되지 않습니다 때문에 (이 경우 효율성에 대해 생각해야한다고 생각하지 않습니다

, 약간 조숙 한 최적화이다). 그러나 코드에서 가장 우아한 것을 고려하십시오. 또한 싱글 톤이 필요한지 생각해보십시오 (정적 클래스로 구현할 수 있습니까?). 두 번째 케이스를 사용하도록 선택할 수도 있습니다. 코드가 좀 더 명확 해지기 때문입니다 (적어도 그렇게 생각합니다). smells의 클래스 종류의

제 생각에는
class AFRouter extends AFObject { 

    function someMethod($bar){ 
     AFRegistry::getInstance()->setFoo($bar); 
    } 

} 
2

, "레지스트리"타입 : 당신이 당신의 속성을 캡슐화 경우이 경우

class AFRouter extends AFObject { 

    function someMethod($bar){ 
     AFRegistry::getInstance()->$foo = $bar; 
    } 

} 

수 또는 것입니다.

학습과 개선을 위해이 작업을 수행했다고 언급 했으므로 레지스트리 클래스를 완전히 제거하고 다른 접근 방법을 생각한 적이 있습니까? 아마도 필요한 데이터를 클래스 생성자로 전달하는 대신 클래스 생성자에게 전달하는 것이 좋습니다. 다음의 모든 클래스가 다른 클래스에 따라 달라지기 때문에

나는 Yngve Sneen는 최고의 방법이 될 것이라고 언급 한 것처럼

는 정적 클래스를 사용하여 ..., 옵션 1 (추상 기본 클래스)를 떠날 것 내 당신이 레지스트리 설정을 유지하기를 원한다면 의견.

다음과 같음 : registry :: set ('var1', $ var1); $ var1 = registry :: get ('var1');

1

이를 고려

class AFRouter extends AFObject { 
    function someMethod($bar) { 
    global $af_registry; 
    $af_registry->setFoo($bar); 
    } 
} 

또는 :

class AFRouter extends AFObject { 
    function someMethod($bar) { 
    af_registry_set('foo', $bar); 
    } 
} 

바 구문은, 기본적으로이 당신의 현재 솔루션 사이에는 차이가 없다.

예, 레지스트리가 본질적으로 전역 변수임을 의미합니다. 그리고 네, 글로벌 변수에 문제가 있습니다. 더 나은 옵션은 pass in the dependencies입니다.

관련 문제