2010-02-04 6 views
0

싱글 톤 팩토리를 가지고 있으며 객체 인스턴스에 대한 참조를 반환하여 싱글 톤 팩토리를 사용하여 인스턴스를 파괴하고 다른 인스턴스를 사용할 수 없도록하고 싶습니다. 생존하기위한 코드. 내가 할 수 있도록하고 싶습니다 무엇PHP에서 객체의 인스턴스에 대한 참조를 반환합니다.

예 :

unset에 대한 문서를 바탕으로
$cat = CatFactory::getInstance(); 
$cat->talk(); //echos 'meow' 
CatFactory::destructInstance(); 
$cat->talk(); //Error: Instance no longer exists 

답변

2

을 만드는 것입니다 :

<?php 
class FooFactory 
{ 
    private static $foo; 

    private function __construct() 
    { 
    } 

    public static function getInstance() 
    { 
    return self::$foo ? self::$foo : (self::$foo = new FooFactory()); 
    } 

    public static function destroyInstance() 
    { 
    self::$foo = null; 
    } 

    public function __call($fn, $args) 
    { 
    if (!method_exists(self::$foo, $fn) || $fn[0] == "_") 
     throw new BadMethodCallException("not callable"); 

    call_user_func_array(array(self::$foo, $fn), $args); 
    } 

    # function hidden since it starts with an underscore 
    private function _listen() 
    { 
    } 

    # private function turned public by __call 
    private function speak($who, $what) 
    { 
    echo "$who said, '$what'\n"; 
    } 

} 

$foo = FooFactory::getInstance(); 
$foo->speak("cat", "meow"); 
$foo->_listen();     # won't work, private function 
FooFactory::destroyInstance(); 
$foo->speak("cow", "moo");  # won't work, instance destroyed 
?> 

은 분명히 해킹입니다.

+0

나는 이것이 어떻게 작동하는지 이해하려고 고심하고있다. 제발 날 정교하게 만들어 주시겠습니까? –

+0

메소드를 비공개로 표시함으로써 마술적인'__call' 메소드를 트리거합니다. 이 함수는'private static $ instance'가 파기되지 않았 으면 호출을 private 함수로 전달합니다. 모든 공용 함수의 맨 위에'if (! self :: $ instance) throw new Exception();을 추가하는 것과 같은 일종입니다. – Matthew

2

, 그게 가능하다고 생각하지 않습니다. 실제로는 개체를 파괴 할 수 없으며 그 개체 만 처리 할 수 ​​없습니다. 여전히 다른 변수가 참조를 보유하고있는 경우 객체는 계속 살아 있습니다.

0

Cat 개체가 개인 $ destroyed 속성을 적용하도록하면 원하는 결과를 얻을 수 있습니다. PHP 5는 기본적으로 객체를 참조로 전달하기 때문에 그 부분에 대해 걱정할 필요가 없습니다.

0

업무용 약이 작동 할 수있는 고양이 클래스

class cat 
{ 
    public $cat; 

    public function __construct() 
    { 
    $this->cat = CatFactory::getInstance(); 
    } 

    public function __destruct() 
    { 
    CatFactory::destructInstance(); 
    } 

} 

$cat = new cat(); 
$cat->cat->talk(); 
$cat->cat->talk(); 
+0

... 알겠습니다. – Aistina

관련 문제