2013-06-10 2 views
5

PHP 상속에 문제가 있습니다.PHP 싱글 톤 및 상속

나는이 기본 클래스를 가지고, 싱글 :

namespace My_Namespace; 

abstract class Singleton { 
    protected static $instance = null; 

    static function get() { 
     if (null == static::$instance) { 
      static::$instance = new static; 
     } 
     return static::$instance; 
    } 

    private function __construct() { 

    } 
} 

내가, B, C, D 그들을를 호출하는 싱글 톤 클래스를 상속 클래스의 무리가 여기 거래입니다. 그 중 하나는 다음과 같다 : 이제

namespace My_Namespace; 

class A extends Singleton { 

    protected function __construct() { 

     B::get(); 

     if (some_condition()) { 
      C::get(); 
     } 
     else { 
      D::get(); 
     } 
    } 
} 

, 난 그냥 모든 압연 얻을 수있는 A::get()을한다. A의 생성자가 예상대로 호출됩니다. 그러면 B의 생성자가 문제없이 다시 호출됩니다. 이제 이상해진다. C::get()을 호출하면 static::$instance을 이미 B 클래스의 객체로 인식하고 C를 인스턴스화하지 않습니다. 나는 B3의 __constructC::get 또는 D::get으로 전화를 걸지 만 내 목적에는 적합하지 않다는 것을 데이지 체인 방식으로 알고 있는지 알고 있습니다. 그것은 그것들이 같은 범위에 있다는 이유로 야기 된 것입니까? 그렇다면 주위에 어떤 방법이 있습니까? 나는 실용적인 목적보다는 호기심을 더 많이 요구하고있다. 나는 그들 각각의 싱글 톤 패턴을 쉽게 구현할 수 있다는 것을 안다. 그래서, 어떤 아이디어? 감사!

P. 제발 '독신은 악하고 당신은 지옥에 타야합니다'라고 말하십시오. 나는 그것을 완벽하게 잘 압니다.

+1

+1 '지옥 주석에 불타오다' – phpisuber01

+1

상속 된 클래스에 인스턴스를 넣을 정적 속성이 필요하다고 생각합니다. 따라서 하위 클래스에'protected static $ instance = null; '을 추가하십시오. . – Orangepill

+0

@Orangepill 당신이 가지고있어. 그 라인을 추가하면 모든 것이 예상대로 작동합니다. '하지만 그것은 전체 싱글 톤 (Singleton) 클래스와 상속 (unheritance) 클래스를 쓸모 없게 만든다. 그 아이디어는 그 클래스에 싱글 톤 기능을 넣는 것이었다. 그게 가능합니까? –

답변

2

static::$instance = new static은 (해당 경우) A의 생성자를 호출합니다.

솔루션을 사용하면 하위 클래스에 인스턴스에 대한 정적 속성이 필요합니다.

그냥 그들에게

protected static $instance = null; 

을 추가하고 그것을 잘 작동합니다.

+0

왜 처음 두 시간 동안 작동합니까? A ​​:: get() 및 B :: get()과 같이 동일한 범위에 있지 않으면 어떻게됩니까? 하지만'C :: get()'을 치자 마자'B :: get'에 사용했던 것과 같은 것을 다시 쓰게됩니까? 그게 의미가 있습니까? –

+1

처음 두 번은 작동하지 않습니다. 처음으로'A :: get()'을 호출하면 ** A 클래스의 생성자가 호출되고 ** 기본 클래스의'$ instance'보다'B :: get()'이 호출됩니다. (null) == static :: $ instance'를 검사하지만, 이제는'$ instance' ** (을) 검사하는'C :: get()'을 호출하기를 원합니다. 클래스 A의 **)는 이미 객체입니다. – bpoiss

+0

설명이 얼마나 쉬운 지 깨닫기 위해 잠시 시간을 내 셨습니다. 그 static :: $ instance = new static'에서 생성자가 호출되어 다른 생성자를 호출합니다. 실제 $ 인스턴스 변수에 아무것도 지정하지 않은 경우 아직 반환되지 않았기 때문에 생성자를 호출합니다. 바보 나. 답변 해주셔서 감사합니다. –

1

상속 된 클래스의 정적 속성은 당신이 살고으로 주택을 제공해야하는 기본 클래스 다를하려면 정적 속성을 처리.

그냥 정의하는 문제를 해결하기

protected static $instance = null; 
파생 클래스의

그렇지 않은 경우 기본 클래스의 속성을 사용합니다.