__destruct()A PHP destructor is a special __destruct() method that runs automatically when an object has no remaining references or when the PHP script finishes shutting down. Destructors give classes a place to close open file handles, release locks, or flush buffered log entries.
PHP tracks how many variables point to an object using reference counting. The moment the last variable referencing an object goes out of scope or is reassigned, PHP invokes __destruct() immediately.
<?php
declare(strict_types=1);
class TempFileWriter
{
/** @var resource */
private $handle;
public function __construct(private string $path)
{
$handle = fopen($path, 'wb');
if ($handle === false) {
throw new RuntimeException("Cannot open {$path}");
}
$this->handle = $handle;
}
public function writeLine(string $text): void
{
fwrite($this->handle, $text . PHP_EOL);
}
public function __destruct()
{
if (is_resource($this->handle)) {
fclose($this->handle);
}
}
}
$writer = new TempFileWriter(sys_get_temp_dir() . '/demo_audit.txt');
$writer->writeLine('Audit session started');
unset($writer); // Triggers __destruct() right here
echo "Cleanup complete." . PHP_EOL;
try / finally Over __destruct()During script shutdown, PHP destroys remaining objects in an unpredictable order, and exceptions thrown inside __destruct() can trigger fatal errors. Use __destruct() as a safety net for internal handles, and rely on explicit try / finally blocks for critical business transactions.
__destruct(): If destruction happens during script shutdown or stack unwinding from another exception, throwing inside __destruct() crashes the request.__destruct(): Destructors take zero arguments and cannot declare a return type.__destruct() run even if exit() is called?Yes. Calling exit() or die() still triggers destructors on active objects unless a fatal engine crash or posix_kill terminates the process abruptly.
fclose() wrapped in is_resource() inside __destruct()?If another method already closed the handle manually, calling fclose() a second time throws a TypeError. Checking is_resource() makes cleanup idempotent.
No. PHP's garbage collector frees normal strings, arrays, and child objects automatically; only add __destruct() when wrapping low-level OS resources.
Sign in to track your learning journey, earn industry-recognized certificates, and join our elite developer community.
Quick Access With
Experiment with the code from this lesson in our interactive playground.