2009-08-19 4 views
2

나는 PHP의 객체 지향 측면을 배우려고 노력하고 있었고, 궁금 해서요 :PHP __Constructor 및 __destructor 질문

나는 데이터베이스에 대한 연결을 열 수 _constructor를 사용하는 경우, 해당 클래스 내에서 함수를 사용 (예 : insert), "insert"메소드가 실행 된 후에 정의 된 __destructor가 연결을 닫으시겠습니까?

class data(){ 
    function __constructor { 
    // connect to db 
    } 

    function insert($data){ 
    // mysql_query(...) 
    } 

    function __destructor { 
    // close connection to db 
    } 
} 

$obj = new db(); 
$obj->insert('mumbo jumbo'); 

데이터베이스에 대한 연결이 아직 열려 있습니까? 왜냐하면 개체가 파괴 된 경우에만 소멸자가 실행된다는 것을 읽었습니다. 그런데 어떻게 물건을 파괴합니까?

+0

클래스 데이터를 호출 한 이후 db()가 아닌 $ obj = new data()라고 생각합니다. 당신은 지속적인 연결을 언급 - 당신은 어떤 mysql 연결 방법을 사용하고 있습니까? 나는 mysql_pconnect()가 mysql과의 지속적인 연결을 인스턴스화하는 유일한 방법이라고 생각한다. –

+0

너무 심각하게 위의 코드를 사용하지 마십시오. 위의 내 주요 질문은 보안 연결을 웹 사이트의 보안 및 성능을 향상시키는 데 필요한 경우 DB에 연결을 닫는 방법으로 수행하는 것이 었습니다. – chutsu

답변

6

PHP에서는 범위를 벗어나면 객체가 파괴됩니다. , 당신은 허용 괜찮을

unset($my_variable); 

을 따라서, 귀하의 질문에 대답 : 스크립트가 실행을 중지하거나 기능이 끝에서 만들어진, 그러나 때 사용 초기 코드에서 객체를 파괴 할 때 일반적이다 소멸자를 사용하여 대부분의 상황에서 DB를 닫을 수 있습니다 (특히 작은 스크립트 사용).

+2

해당 행은 객체의 할당이 해제되고 '$ my_variable'이 객체를 가리키는 마지막 객체라면 소멸자가 호출됩니다. – chaos

2

개체가 더 이상 참조되지 않으면 개체가 파괴됩니다 (예 : unset()- 개체를 보유하는 마지막 변수 또는 스크립트 실행이 종료 될 때).

그런데 마술 방법은 __construct__destruct이고, 뒤에는 -or이 붙지 않습니다.

1

BTW에서 생성자와 소멸자는 __construct 및 __destruct라고합니다.

db에 대한 참조가 더 이상 없을 때 __destructor가 호출됩니다. 일반적으로 개체가 범위를 벗어날 때 발생하지만 다른 참조를 저장 한 경우에는 발생하지 않습니다. 당신은

unset($obj); 

를 사용하여 db에 대한 참조를 제거 할 수 있습니다 당신이 저장 한 경우도 마찬가지로 $ 어디서나되어 obj.

0

PHP는 데이터베이스에 대한 지속적인 연결도 지원합니다. 즉, 객체가 파괴되었다고해도 DB에 대한 연결이 "백그라운드에서"열려 있고 해당 pconnect를 호출 할 때 다시 사용됩니다 또는 PDO analogue)를 사용할 수 있습니다.

+0

명확히 말하면, PHP는 mysql_pconnect()를 사용하면 영구적 인 연결을 지원합니다. 다른 모든 mysql 연결 메소드 AFAIK는 스크립트 실행이 끝나면 자동으로 닫힙니다. –

+0

오, 거기에는 pg_pconnect, sybase_pconnect 등과 같은 mysql_pconnect 외에 다른 것들이 있습니다. 세계에서 연결 풀링을하는 것이 더 좋은 방법입니다. 당신은 그것에 대해 절대적으로 옳습니다. 질문이 '데이터베이스 연결 종료'에 관한 것이었기 때문에이 부분을 언급 할 적절한 장소라고 생각했습니다. –