PHP 8.3 语法变化 - SQLite3:新的 SQLite3Exception、弃用和更改

作者: 温新

图书: 【PHP 8.3 新特性】

阅读: 690

时间: 2024-11-23 14:00:14

hi,我是温新,一名 PHPer

在 PHP 8.3 中,SQLite3 扩展的错误处理行为得到了改进,以鼓励使用异常,并阻止现有的 PHP 警告行为。

SQLite3 扩展的当前默认错误处理行为是发出 PHP 警告。这在 PHP 8.3 中不会改变,而 PHP 8.3 和其他 PHP 8.x 版本在出现错误时仍然会发出 PHP 警告。SQLite3 扩展提供了一个 SQLite3::enableExceptions(true) 方法,该方法将错误处理行为更改为抛出异常,而不是发出 PHP 警告。

在 PHP 8.3 中,有四个与此功能相关的更改:

  • 添加一个新的 SQLite3Exception 异常类,该类继承自现有的 `\Exception 类。
  • 从 PHP 警告消息中移除的错误代码,并作为 SQLite3Exception 错误代码(SQLite3Exception::getCode())添加。
  • SQLite3::enableExceptions(false) 已被弃用。

PHP 8.3 和所有 PHP 8.3+ 版本将继续发出警告。它继续说,必须调用 SQLite3::enableQuery(true) 来启用 SQL

新的 SQLite3Exception 异常类

PHP 8.3 SQLite3 扩展在全局命名空间中添加了一个新的 Exception 类,它扩展了现有的 \Exception 类。

class SQLite3Exception extends \Exception {}

它不引入任何额外的常量、属性或方法。

新的 \SQLite3Exception 异常类可以在用户端的 PHP 代码中进行填充。虽然这不会改变旧版 PHP 版本中 SQLite3 扩展的行为,但如果应用程序需要在多个 PHP 版本(包括 PHP 8.3 )之间序列化和反序列化异常,这将有所帮助。

SQLite3 错误代码移动到 SQLite3Exception

在 PHP 8.3 之前,由 SQLite3 扩展发出的 PHP 警告包含警告消息中的错误代码。

Unable to prepare statement: 23, not authorized

在 PHP 8.3 中,所有这些消息都已更改为在警告消息中不包含错误代码。

例如,上面的 PHP 警告消息在 PHP 8.3 中被修改为:

Unable to prepare statement: not authorized

在 PHP 8.3 及更高版本中,要获取错误代码,请在 SQLite3 实例中启用 Exception 支持,并检查 SQL 的错误代码。

$db = new SQLite3(':memory:');
$db->enableExceptions(true);

$db->setAuthorizer(function () {
    return false;
});

try {
    $db->querySingle('SELECT 1;');
} catch (\SQLite3Exception $e) {
    echo $e->getMessage() . "\n";
    echo $e->getCode();
}

SQLite3::enableExceptions(false) 弃用

SQLite3 扩展在所有 PHP 8.x 版本中继续发出警告,包 括PHP 8.3 和更高版本。这本质上与隐式调用 SQLite3::enableException(false) 相同。

但是,显式调用 SQLite3::enableLog(false) 在 PHP 8.3 及更高版本中不推荐使用。

$db = new SQLite3(':memory:');
$db->enableExceptions(false);
Deprecated: SQLite3::enableExceptions(): Use of warnings for SQLite3 is deprecated
请登录后再评论