From:             [EMAIL PROTECTED]
Operating system: Linux
PHP version:      4CVS-2002-11-04
PHP Bug Type:     Zend Engine 2 problem
Bug description:  order of destructor calls

Using this small PHP code :

<?php

class Referenced
{
    private $m_references=0;

    function __construct()
    {
    }

    function ref()
    {
        $this->m_references++;
    }

    function unref()
    {
        $this->m_references--;
    }

    function __destruct()
    {
        echo 'in Referenced Destructor...<br>';
        echo "references = ".$this->m_references."<br>";
        echo 'out of Referenced Destructor<br>';
    }
}

class Referencer
{
    private $m_ref;

    function __construct($t)
    {
        $this->m_ref = $t;
        $t->ref();
    }

    function __destruct()
    {
        echo "in Referencer Destructor...<br>";
        $this->m_ref->unref();
        echo "out of Referencer Destructor<br>";
    }
}

$t = new Referenced();
echo 'instanciating first Referencer object...<br>';
$a = new Referencer($t);
echo 'instanciating second Referencer object...<br>';
$b = new Referencer($t);
echo 'deleting first Referencer object...<br>';
unset($a);
echo '<b>terminating</b><br>';

?>

I expected PHP to call unref() on Referenced object for the second
Referencer instance in the Referencer destructor, and then let Referenced
object be freed. This simulated output correspond to this expectation :

instanciating first Referencer object...
instanciating second Referencer object...
deleting first Referencer object...
in Referencer Destructor...
out of Referencer Destructor
terminating
in Referencer Destructor
out of Referencer Destructor
in Referenced Destructor...
references = 0
out of Referenced Destructor...

PHP gave me this output :

instanciating first Referencer object...
instanciating second Referencer object...
deleting first Referencer object...
in Referencer Destructor...
out of Referencer Destructor
terminating
in Referenced Destructor...
references = 1
out of Referenced Destructor
in Referencer Destructor...

Fatal error: Trying to access invalid object in <blablabla>/test.php on
line 42

It seems that object instances are freed BEFORE the call of the object
destructor; I think object variables have to be freed after the destructor
call...
-- 
Edit bug report at http://bugs.php.net/?id=20240&edit=1
-- 
Try a CVS snapshot:         http://bugs.php.net/fix.php?id=20240&r=trysnapshot
Fixed in CVS:               http://bugs.php.net/fix.php?id=20240&r=fixedcvs
Fixed in release:           http://bugs.php.net/fix.php?id=20240&r=alreadyfixed
Need backtrace:             http://bugs.php.net/fix.php?id=20240&r=needtrace
Try newer version:          http://bugs.php.net/fix.php?id=20240&r=oldversion
Not developer issue:        http://bugs.php.net/fix.php?id=20240&r=support
Expected behavior:          http://bugs.php.net/fix.php?id=20240&r=notwrong
Not enough info:            http://bugs.php.net/fix.php?id=20240&r=notenoughinfo
Submitted twice:            http://bugs.php.net/fix.php?id=20240&r=submittedtwice
register_globals:           http://bugs.php.net/fix.php?id=20240&r=globals
PHP 3 support discontinued: http://bugs.php.net/fix.php?id=20240&r=php3
Daylight Savings:           http://bugs.php.net/fix.php?id=20240&r=dst
IIS Stability:              http://bugs.php.net/fix.php?id=20240&r=isapi

Reply via email to