2011-07-26 9 views
2

어쩌면 그 늦은 것이나 뭔가가 나를 괴롭 히고 있습니다. 기본적으로 나는 운동을위한 프레임 워크를 쓰고, 나의 oop 기술을 구르려고 노력하지만, 나는 다소 붙어 다닙니다. 나는 신의 오류를 범할 수 있다고 생각한다. 나는 단지 모른다. :)싱글 톤 인스턴스 var가 초기화시 null이 아닙니다.

그래서 전체 프로그램을 초기화하는 부트 스트랩 클래스가있다. 나는 당신이 app (또는 원하는 경우 모델)을 호출 할 수있는 컨트롤러를 생성한다. 모든 컨트롤러와 앱은 싱글 톤 패턴을 구현하는 초기화 클래스의 하위 클래스입니다. 이것은 내가 주어진 컨트롤러/애플 리케이션을 기반으로 다른 init 물건에 대한 구조 함수를 사용하고 싶습니다.

이제 컨트롤러 내에서 응용 프로그램을 초기화하려고하면 인스턴스 var가 이미 컨트롤러 객체 (null로 생각됨)로 설정됩니다. 충분히 메신저 명확하지, 여기 아주 간단하고 원시 형태의 코드입니다 :

<?php 

final class Bootstrap { 
    public function __construct() { 
     $controller = Controller::init(); 
     $controller->index(); 
    } 
} 

abstract class Initialization { 
    private static $_instance = NULL; 

    final public static function init() { 
     $c = get_called_class(); 

     var_dump(self::$_instance); 

     self::$_instance = new $c(); 

     return self::$_instance; 
    } 

    final protected function app($app) { 
     $app::init(); 
    } 
} 

final class Form extends Initialization { } 

final class Controller extends Initialization { 
    final public function Index() { 
     $this->app('form'); 
    } 
} 

$bootstrap = new Bootstrap(); 

?> 

출력은

null 
object(Controller)[2] 

임 혼란 이유 인스턴스가 이미 양식 응용 프로그램에서 설정은? 나는 그것이 "자신의"정적 인스턴스 var의 상속 줄 알았는데 ??

+0

이 youself에게 부탁을하고 싱글 제거. 당신은 거기 필요가 없습니다. [싱글 톤이 필요한 사람] (http://stackoverflow.com/questions/4595964/who-needs-singletons/4596323#4596323)을 참조하십시오. 또한 OOP를 수행하려면 솔리드 원칙을 숙지하십시오. 또한 정적 클래스를 최소한으로 줄이고 기본 클래스를 사용하여 상속을 남용하지 마십시오. 마지막 키워드도 없애고 Unit-Tests를 작성하여 위의 코드가 얼마나 발을 쏠 수 있는지 느껴보십시오. – Gordon

+0

내 __construct()를 유지할 수 있도록 싱글 톤만 사용했습니다. 이것은 내가 보통 구현하는 패턴이 아닙니다. SOLID를 읽을 때 권장되는 리소스가 있습니까? 위키에 대한 설명을 읽었습니다. 마지막 키워드를 생략해야하는 어떤 particulary 이유? – Esben

+0

Wikipedia 항목은 실제로 좋은 시작입니다. 내부 링크와 하단의 링크 된 리소스 중 일부는 오랫동안 계속 읽어야합니다. 단위 테스트를 수행 할 때 의존성을 조롱하지 못하도록하기 때문에 최종 키워드를 생략해야합니다. – Gordon

답변

3

self::$_instance 대신 static::$_instance과 같이 늦은 정적 바인딩으로 호출하는 경우 자신의 정적 인스턴스 var 만 가져옵니다. 또한 private 대신 protected으로 설정하는 것이 좋습니다.

self::은 컴파일 타임에 결정되므로 어떤 클래스를 확장해도 관계없이 항상 Initialization::$_instance을 참조합니다. static::은 프로그램 실행 중에 결정됩니다.

코드 변경 :

abstract class Initialization { 
    protected static $_instance = NULL; 

    final public static function init() { 
     $c = get_called_class(); 
     static::$_instance = new $c(); 
     return static::$_instance; 
    } 
+0

죄송합니다. 이해가되지 않습니까? :) – Esben

+0

몇 가지 설명을 추가했습니다. – Wrikken

+0

당신, 선생님. 고맙습니다! – Esben