PHP 8.3 语法变化 - SQLite3:新的 SQLite3Exception、弃用和更改
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