2011-12-21 4 views
1

__construct에 조건이있는 경우 __destruct으로 전화해야하는 상황이 발생했습니다!__construct에서 __destruct?

생성자에서 소멸자를 호출하는 방법은 무엇입니까?

이 방법이 있습니까?

트릭으로이 작업을 수행 할 수 있지만 내 수업에서해야합니다. 목표는 내 기준을 충족시키지 않으면 클래스를 파괴하는 것입니다.

편집 : 생성자에서

게시물을 삭제하기위한 시도하고 사용자가 관리자가 아닌 다른 사람이있는 경우 나, 사용자 권한을 확인, 그 클래스의 객체가 인스턴스화, 또는 기타의하지 말아야 낱말은 파괴되어야한다.

+1

당신의 기준은 무엇입니까? 그것이 당신이 요구하는 것이라면 그것은 객체 전체를 삼킬 수 없습니다. – chelmertz

답변

10

생성자에서 실제 작업을하지 마십시오. 생성자는 기본적으로 객체의 인스턴스를 작성해야합니다. 인스턴스가 클래스의 메서드에 의해 소유되지 않고 new 연산자를 호출 한 함수에 의해 생성되므로 __destruct()을 생성자에서 호출하는 것은 의미가 없습니다.

개체를 구성 할 수없는 경우 호출 사이트에서 new 연산자로 반환해야 할 내용을 스스로에게 물어보십시오.

$obj = new Class(); 
객체가 제대로 구축 할 수없는 경우 $obj에 할당해야합니까

? NULL? 아니면 코드가 전혀 이해가 안되나요? 생성자는 모두 실패 할 수 있도록

  1. 는, 생성자에서 비 건설 코드를 제거

    당신은 몇 가지 옵션이 있습니다. 다른 방법으로 실패한 코드를 넣으십시오.예 :

    $obj = new Class(); 
    if ($obj->initSomeStateThatMayFail()) { 
        // good, proceed... 
    } else { 
        // handle failure somehow... 
    } 
    unset($obj); // calls __destruct() 
    
  2. 생성자에서 오류가 호출자에게 신호 할 필요가있는 경우, 적절하게 null 또는 새 인스턴스 중 하나를이 클래스의 인스턴스를 사용할 수 있는지 여부를 테스트하고 돌려주는 static 팩토리 메소드를 사용합니다.

    class Class { 
        static function makeClass() { 
         if (testIfValidToInstantiate()) { 
          return new self(); 
         } else { 
          return null; 
         } 
        } 
        // ... 
    } 
    
    $obj = Class::makeClass(); 
    if ($obj !== null) { 
        // proceed... 
    } 
    
  3. 코드가, 아마도 당신은 예외를 발생해야 모든 클래스를 생성 할 수 없으면 이해가되지 않는 경우

    .

    class Class { 
        function __construct() { 
         if (!testIfValidToInstantiate()) 
          throw new Exception("Unexpected condition"); 
         // ... 
        } 
    } 
    
    try { 
        $obj = new Class(); 
        // ... 
    } catch (Exception $e) { 
        // do something to handle this situation... 
    } 
    
+0

정적 공장이 그 일을했습니다. tnx @ 줄리아노 – ALH

0

생성자에서 개체를 삭제할 수는 없지만 개체를 ​​만든 후에 개체를 삭제할 수는 있습니다. 이런 식으로 뭔가 :

<?php 
class test{ 
    function __construct(&$dest=false){ 
    echo "Constructed\n"; 
    if(1 == 1){ //Some condition 
     $dest = true; 
    } 
    } 

    function __destruct(){ 
    echo "De-Constructed\n"; 
    } 
} 

$a = new test($d); 
if($d){ 
    unset($a); 
} 
echo "End Prog\n"; 

데모 : 소멸자를 호출하면 작업 세트에서 클래스를 삭제하는 것과 같은 일이 아니라고 http://ideone.com/fJxOq

+1

그건 내가 속임수로 한 짓이야,하지만 내 질문은 생성자 안에서 인스턴스화하는 개체를 파괴하는 것입니다. – ALH

3

가, 양해 해 주시기 바랍니다!

myClass가 다음

생성자에서 소멸 된 클래스가, 경우
$a=new myClass(); 

여전히이 myClass가의 인스턴스에 할당되는 $가 발생합니다!

+0

그건 내가 찾고있는 것이 아니지만 어쨌든 tnx입니다. – ALH

0

생성자 내에 예외가 발생하면 객체가 생성되지 않습니다 ... 생성자 코드가 조건을 식별하면 생성자 내에서 필요한 모든 것을 정리하고 예외를 throw합니다. 동봉하는 것을 기억하십시오 try/catch 블록 내에서의 인스턴스 생성.

class testClass { 
    public function __construct($killMe=false) { 
     if ($killMe) { 
      // Do any tidying up you need within the class 
      throw new Exception('KILLED'); 
     } 
    } 

} 

try { 
    $a = new testClass(false); 
} catch (Exception $e) { 
    echo 'DIED IN CONSTRUCTION',PHP_EOL; 
} 
var_dump($a); 

try { 
    $b = new testClass(true); 
} catch (Exception $e) { 
    echo 'DIED IN CONSTRUCTION',PHP_EOL; 
} 
var_dump($b); 
+0

예외를 사용하지 않으려 고합니다. 왜냐하면 나는 약간의 오버 헤드를 만들고 싶지 않기 때문입니다. 당신의 도움을 위해 @ 마크 베이커에게 감사드립니다. – ALH

관련 문제