__destruct() behaviour

php.internals

Ard Biesheuvel

22 years ago
While http://www.php.net/zend-engine-2.php claims the following 'Like constructors, parent destructors will not be called implicitly by the engine. In order to run a parent destructor, one would have to explicitly call parent::__destruct() in the destructor body. the following code php -r 'abstract class A { protected function __destruct() {} } class B extends A {} $b = new B;' results in Warning: Call to protected B::__destruct() from context '' during shutdown ignored in Unknown on line 0 which is inconsistent with the quoted description. It also introduces an asymmetry compared to constructors which I think is confusing. Any thoughts ?
-- Ard

Marcus Börger

22 years ago
Hello Ard, Saturday, March 6, 2004, 6:21:38 PM, you wrote:
> While http://www.php.net/zend-engine-2.php claims the following
> 'Like constructors, parent destructors will not be called > implicitly by the engine. In order to run a parent destructor, > one would have to explicitly call parent::__destruct() in the > destructor body.
> the following code
> php -r 'abstract class A { protected function __destruct() {} } > class B extends A {} > $b = new B;'
> results in
> Warning: Call to protected B::__destruct() from context '' > during shutdown ignored in Unknown on line 0
> which is inconsistent with the quoted description. > It also introduces an asymmetry compared to constructors which I think > is confusing.
> Any thoughts ?
Yes your understanding and your code is wrong. In your code you explicitly decalre that the destructor may only be called from that class's context. Normally this results in an E_ERROR. But when it happens we only issue an E_WARNING because the E_ERROR would restart the Rshutdown process.
-- Best regards, Marcus mailto:helly@php.net