2010-06-22 4 views
2

PHP에서 사용할 수 있거나 먹을 수있는 객체가 있습니다. 어쨌든, 그것은 끝났어. 공용 메서드 useItem()에 의해 호출되는 activate()이라는 추상 보호 된 메서드가 있습니다.오브젝트 내의 소멸자 호출 PHP의 메소드

activate()으로 전화를 걸어 자신을 파괴 할 수 있습니까? 그렇지 않다면 항목이 영구적으로 사라 졌는지 확인하는 가장 좋은 방법은 무엇입니까?

답변

1

원할 경우 간단히 설정 해제() 할 수 있습니다.

현실적으로 PHP에서 garbage collector or GC은 변수가 범위를 벗어나거나 참조가없는 경우 필요한 모든 작업을 수행합니다. 분명한 것은 GC가 PHP 5.3에서 주요한 재 작업을 수행했기 때문에 5.2.x를 사용하고 있다면 여전히 성능 문제가있을 수 있습니다. 만약 내가 제대로 이해하고

3

당신 같은이 : 물론

$obj = new MyClass(); 
$obj->useItem(); 
unset($obj); 
//if there are cyclic references, the object won't be destroyed except 
//in PHP 5.3 if the garbage collector is called 

:이 경우

class AbstractMyClass { 
    abstract protected function activate(); 
    public function useItem() { 
     //... 
     $this->activate(); 
     //... 
    } 
} 

class MyClass extends AbstractMyClass { /* ... */ } 

을, 아니, 짧은 useItem를 호출 한 후 파괴되는 개체를 만들 수있는 방법이 없다 파괴 가능한 객체를 다른 객체로 캡슐화 할 수 있습니다.

class MyClass extends AbstractMyClass { /* ... */ } 
class MyWrapper { 
    private $inner; 
    public function __construct($object) { 
     $this->inner = $object; 
    } 
    public function useItem() { 
     if ($this->inner === null) 
      throw new InvalidStateException(); 
     $this->inner->useItem(); 
     $this->inner = null; 
    } 
} 

$obj = new MyWrapper(new MyClass()); 
$obj->useItem();