문제

php5에서 __destruct () 메소드가 각 객체 인스턴스에 대해 호출되도록 보장됩니까? 프로그램의 예외로 인해 이런 일이 발생하지 않습니까?

도움이 되었습니까?

해결책

모든 참조가 해제 될 때 또는 스크립트가 종료 될 때 파괴자는 호출됩니다. 스크립트가 제대로 끝나는 경우이를 의미한다고 가정합니다. 비판적인 예외가 파괴자를 불러 내도록 보장하지는 않을 것입니다.

그만큼 PHP 문서 조금 얇지 만, 소멸자의 예외는 문제를 일으킬 것이라고 말합니다.

다른 팁

또한 자체 소멸자가있는 서브 클래스의 경우 부모 소멸자는 ~ 아니다 자동으로 호출됩니다.

명시 적으로 전화해야합니다 부모 :: __ Destruct () 서브 클래스에서 __destruct () 방법 상위 클래스에 필요한 정리가있는 경우.

내 경험에 따라 파괴자는 항상 PHP 5.3에서 호출되지만 일부 코드 조각이 exit ()를 호출하거나 치명적인 오류가 발생하면 PHP가 "모든"주문으로 소멸자를 호출 할 것임을 경고합니다 (실제 주문은 주문이라고 생각합니다. 메모리 또는 순서 메모리는 객체에 대해 예약되었습니다. 실제로이 순서는 거의 항상 문제가됩니다). 이를 PHP 문서에서 "종료 시퀀스"라고합니다.

파괴자의 PHP 문서 말 :

PHP 5는 C ++와 같은 다른 객체 지향 언어와 유사한 소멸자 개념을 소개합니다. 특정 물체에 대한 다른 참조가 없거나 셧다운 시퀀스 중에 어떤 순서로도 파괴자 방법이 호출됩니다.

결과적으로 Y에 대한 참조를 보유한 클래스 X가있는 경우 Y의 소멸자가 이미 호출 된 후 X의 소멸자가 호출 될 수 있습니다. 바라건대, Y에 대한 언급은 그다지 중요하지 않았습니다 ... 공식적으로 이것은 문서화 되었기 때문에 버그가 아닙니다.

그러나 공식적으로 PHP가 파괴자가 정상적으로 호출되는지 (파괴자가 올바른 순서로 호출) 또는 소멸자가 "모든"주문으로 호출되는지 알 수있는 방법을 제공하지 않기 때문에이 문제를 해결하기가 매우 어렵습니다. 이미 파괴되었습니다. Debug_backtrace ()를 사용하여 감지가 부족하고 스택을 검사 할 수 있습니다. 정상적인 스택의 부족은 PHP 5.3의 "종료 시퀀스"를 암시하는 것으로 보이지만 이것은 정의되지 않았습니다. 원형 참조가있는 경우, 해당 물체의 소멸자는 PHP 5.2 이하로 전혀 호출되지 않으며 PHP 5.3 이상의 "종료 시퀀스"중에 "모든"주문으로 호출됩니다. 원형 참조의 경우 논리적으로 "올바른"주문 "이 존재하지 않으므로 모든 주문이 그에게 좋습니다.

몇 가지 예외가 있습니다 (결국 PHP입니다).

  • 만약에 exit() 다른 소멸자로 불려진다.http://php.net/manual/en/language.oop5.decon.php)
  • 만약에 FATAL 오류는 어디에서나 발생합니다 (많은 가능한 원인, 예를 들어 다른 파괴자로부터 예외를 던지려고 시도하면 하나의 원인이 될 수 있습니다).

물론, PHP 엔진이 세그먼트 화 결함을 누르거나 다른 내부 버그가 발생하면 모든 베팅이 꺼져 있습니다.

이해하고 싶다면 현재의 "종료 시퀀스"의 구현, 참조 https://stackoverflow.com/a/14101767. 이 구현은 향후 PHP 버전에서 변경 될 수 있습니다.

원형 참조가있는 현재 버그가 있습니다. http://bugs.php.net/bug.php?id=335955.3에 고정해야합니다

확실히 가고 싶다면 종료 기능을 사용하십시오. register_shutdown_function ()

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top