PHP5,析构函数中的异常

PHP5,析构函数中的异常,php,exception,destructor,Php,Exception,Destructor,我现在正在读一本2006年出版的《专业人士PHP5》。在一个例子中,他们在析构函数中抛出异常,很长一段时间我不明白为什么我在析构函数中的最后一个异常不起作用,然后我搜索了一下,发现在PHP=>5.3中,在析构函数中抛出异常是不可用的。所以,如果在析构函数中,如果变量$needsUpdate=true,我更新数据库,那么该如何做更好并关闭数据库连接,所以若数据库无法更新,我想抛出异常。例如,我在DB类中抛出异常,但在主文件中捕获它们,如下所示: PHP Fatal error: Exception

我现在正在读一本2006年出版的《专业人士PHP5》。在一个例子中,他们在析构函数中抛出异常,很长一段时间我不明白为什么我在析构函数中的最后一个异常不起作用,然后我搜索了一下,发现在PHP=>5.3中,在析构函数中抛出异常是不可用的。所以,如果在析构函数中,如果变量
$needsUpdate=true,我更新数据库,那么该如何做更好
并关闭数据库连接,所以若数据库无法更新,我想抛出异常。例如,我在DB类中抛出异常,但在主文件中捕获它们,如下所示:

PHP Fatal error: Exception thrown without a stack frame in Unknown on line 0
它的类小部件:

class Widget {

    private $_id;
    private $_name;
    private $_description; private $_hDB;
    private $_needsUpdating = false;

    public function __construct($widgetID) {

        $this->_hDB = new mysqli('localhost', 'phpbook', 'Un+)J=<AaH', 'phpbook');
        if (! $this->_hDB) {
            throw new Exception('Не удалось подключится к базе данных');
        }
        $sql = "SELECT `name`, `description` FROM widgets WHERE id = '$widgetID'";
        $rs = $this->_hDB->query($sql);

        if (! $rs) {
            throw new Exception("Произошла ошибка при выборе базы данных");
        }

        if (! $rs->num_rows) {
            throw new Exception("Указаная запись в базе данных отсутствует");
        }
        $data = $rs->fetch_assoc();
        $this->_id = $widgetID;
        $this->_name = $data['name'];
        $this->_description = $data['description'];

    }

    public function getName() {
        return $this->_name;
    }

    public function getDescription() {
        return $this->_description;
    }

    public function setName($name) {
        $this->_name = $name;
        $this->_needsUpdating = true;
    }

    public function setDescription($description) {
        $this->_description = $description;
        $this->_needsUpdating = true;
    }

    public function __destruct() {
        if (! $this->_needsUpdating) {
            return;
        }

        $sql = 'UPDAT2E `widgets` SET';
        $sql .= ' `name` = "' . $this->_hDB->real_escape_string($this->_name) . '",';
        $sql .= ' `description` = "' . $this->_hDB->real_escape_string($this->_description) . '" ';
        $sql .= 'WHERE id = ' . $this->_id;


        $rs = $this->_hDB->query($sql);
        if (! $rs) {
            throw new Exception("Произошла ошибка при обновлении базы данных");
        }
        $this->_hDB->close();
    }
}
类小部件{
私人$u id;
私有$u名称;
private$\u description;private$\u hDB;
private$\u needsupdated=false;
公共函数构造($widgetID){

$this->_hDB=new mysqli('localhost','phpbook','Un+)J=析构函数中的异常(可能)会导致致命错误。文档在此处说明:构造“>http://us.php.net/_construct

注: 试图从析构函数(在脚本终止时调用)引发异常会导致致命错误

在大多数情况下,您会得到如下结果:

PHP Fatal error: Exception thrown without a stack frame in Unknown on line 0

一个好的方法是不要重新发明这个轮子,并采取例如条令()来帮助你完成这项任务。即使你不能使用这段软件,你也可以查看源代码来了解Benjamin是如何做到的。查看EntityManager()和UnitOfWork(),这与您在问题中提到的处理有关。

但是您没有在代码中的任何地方销毁对象-那么您的问题到底是什么?不,它在运行所有代码后自动销毁,例如,如果不抛出新异常(“ППППззззззззззззззззззз1079设置echo是我在update2e中设置错误的SQL查询的工作原因,所以为什么echo和所有其他工作都正确,但不能抛出execption,我知道我可以使用die(“错误”);和类似的内容,但非常有趣的是如何正确地使用exeption。哦……对不起,我的错误。我在某个地方读到,销毁将在所有过程后自动调用,对不起,我刚刚开始学习OOP。我在我的代码
unset($widget)中添加了
我得到了最后一个异常。例如:)所以现在我对我的代码和最后一个异常的正确性有点怀疑。我不明白为什么我所有的SQL查询都是在没有这个unset的情况下进行的,但是execption只有在unset之后才会出现。有帮助吗?Destructor中的SQL DML代码?你确定这本书是给“专业人士”的吗“?为什么要这样做?好的,谢谢你的回答。我想在这本书的后面会是这样的:“嘿,伙计,你还记得在第一章中我们在析构函数中抛出了一个异常吗?所以请不要这么说,只是为了你的理解,这是一个不好的例子。”但同样,谢谢你。