Php析构函数正在调用两次

时间:2014-06-11 11:49:48

标签: php mysql

我搜索了很多,发现很多类似于我的问题,但没有我在哪里建立我的芒果,所以我在这里问。

我有以下代码。

class Checkout
{
static $dbCon = null;
private $CheckoutId = null;

public function __construct()
{
    echo"Contructor";
//       Check if have an checkout already
    $Prepare = Checkout::$dbCon ->prepare("SELECT * FROM checkouts WHERE SessionId = :SessionId AND LastTouchTime >= :Time ORDER BY Id DESC");
    $Prepare -> bindValue(':SessionId',session_id());
    $Prepare -> bindValue(':Time',0); // Will be something like time()-(60*60*2)
    try{
        $Prepare -> execute();
        if($Prepare -> rowCount() != 0)
        {
            $Checkout = $Prepare->fetch(PDO::FETCH_ASSOC);
            $ThisVar = unserialize($Checkout['ObjectSerialized']);
            foreach($ThisVar as $Key => $Val)
                $this->$Key = $Val;
            $this->CheckoutId = $Checkout['Id'];
            echo " -> $this->CheckoutId\n";
        }
    }catch(PDOException $e)
    { die("Error Getting checkout From Db: ".$e->getMessage()); }
}
public function __destruct()
{
    echo "Destructor -> ".(is_null($this->CheckoutId)?'Null':$this->CheckoutId)."\n";
    if(is_null($this->CheckoutId))
    {// Insert Checkout In db
            $InsertCheckout = Checkout::$dbCon->prepare("INSERT INTO checkouts (`SessionId`,`LastTouchTime`,`ObjectSerialized`) VALUES(:SessionId,:LastTouchTime,:ObjectSer);");
            $InsertCheckout -> bindValue(':SessionId',session_id());
            $InsertCheckout -> bindValue(':LastTouchTime',time());
            $InsertCheckout -> bindValue(':ObjectSer',serialize($this));
            try{
                $InsertCheckout -> execute();
                echo "Just Inserted Checkout\n";
            }catch(PDOException $e)
            {
                die("Error SavingCart In Db: ".$e->getMessage());
            }
    }
    else
    {
        //$UpdateCheckout = Checkout::$dbCon->prepare("");
    }
}
}

我像以下

一样创建这个类
Checkout::$dbCon = new $PDOObject; ( is valid )
$Checkout = new Checkout();

我得到的结果是奇怪的事情。

Contructor -> 142
Destructor -> Null
Just Inserted Checkout
Destructor -> 142

你看这里如果contruct给我一个数字,这意味着这个数字在$ this-> $ CheckoutId

但是然后析构函数运行并且$ CheckoutId中没有数字,所以它重新插入一条新记录。

然后析构函数再次运行并且ops这次他有一个数字,所以它会尝试更新记录。

是否有遗漏的东西?

修改 如果我评论该行$ThisVar = unserialize($Checkout['ObjectSerialized']); 它不会毫无理由地运行破坏。

为什么?

0 个答案:

没有答案