探索 PHP 8.3 中的新功能与增强功能
PHP 8.3 引入了许多值得期待的新特性和增强功能,同时也弃用了一些老的功能。本文将详细解释PHP 8.3中的新功能,这些新功能使得PHP作为默认编码语言更加优雅,并且对开发人员更加友好。
PHP一直以来都可以轻松地在本地使用PHP进行桌面编程。当然,还有其他许多工具可以用于桌面编程,但我觉得原生的PHP更加酷炫。无论如何,让我们开始深入了解这些新功能吧。
主要新特性
• 类型化的类常量 (Typed Class Constants)
• 支持获取动态的类常量 (dynamic class constant) 和枚举成员 (Enum member)
• 新增json_validate()函数,用于验证 JSON
• 添加 Random 扩展
• 添加mb_str_pad()
• 添加#[\Override]属性
• 新增更多 PHP Sockets 选项
• 增加对 cURL 7.87 及以下版本的新 cURL 选项和常量的支持
• 支持匿名只读类 (anonymous read-only classes)
• 支持在数组中使用负数索引 (negative indices)
1. Json Validation
我敢打赌,在开发新项目时,我们所有人都会尝试验证字符串是否是 json。此功能将本机方法添加到 php 中,用于验证字符串是否为 json。我知道这是非常酷的补充。
$json = '{ "example": "title" }';
$is_json = false;
if (json_validate($json)) {
// Valid JSON.
$is_json = true;
}
// Or better way
$is_json = json_validate($json);
目前,大多数PHP程序员使用该 json_decode() 函数来完成此任务,但这使用内存和处理能力,而这些内存和处理能力并不是仅仅检查有效性所必需的。无需用于 json_decode 验证 json 字符串。
2. Improved unserialize() error handling
改进了反序列化()错误处理。
unserialize() 中的错误处理目前缺乏一致性,因为它有可能根据格式不正确的输入字符串的性质生成E_NOTICE、E_WARNING甚至抛出不可预测的异常或错误。使用新的php功能将涵盖此问题。
在建议的修改之前,在 PHP 中管理反序列化错误的过程可能类似于以下内容:
try {
set_error_handler(static function ($severity, $message, $file, $line) {
throw new \ErrorException($message, 0, $severity, $file, $line);
});
$result = unserialize($serialized);
} catch (\Throwable $e) {
// Optional catch block if you wish to handle the unserialization error.
} finally {
restore_error_handler();
}
var_dump($result);
在此功能之后,我们可以通过以下方式使用:
function unserialize(string $data, array $options = []): mixed
{
try {
// The existing unserialization logic happens here.
} catch (\Throwable $e) {
throw new \UnserializationFailedException(previous: $e);
}
}
而反序列化失败异常的实现是
class UnserializationFailedException extends \Exception
{
}
3. Fetching Class Constants Dynamically
在 8.3 之前,我们不能通过变量获取基于类的常量。当我们调用它们时,我们应该直接添加常量名称。让我们看看如何使用当前版本的 php 获取常量:
class StatusCodes {
const OK = 200;
const NOT_FOUND = 404;
const INTERNAL_ERROR = 500;
const UNAUTHORIZED = 401;
const FORBIDDEN = 403;
}
// Accessing the constants
echo StatusCodes::OK; // Output: 200
echo StatusCodes::NOT_FOUND; // Output: 404
echo StatusCodes::INTERNAL_ERROR; // Output: 500
echo StatusCodes::UNAUTHORIZED; // Output: 401
echo StatusCodes::FORBIDDEN; // Output: 403
在 8.3 中,我们可以使用变量来获取常量
class StatusCodes {
const OK = 200;
const NOT_FOUND = 404;
const INTERNAL_ERROR = 500;
const UNAUTHORIZED = 401;
const FORBIDDEN = 403;
}
$variable = "OK";
// Accessing the constants
echo StatusCodes::{$variable} // Output: 200
$variable = "NOT_FOUND";
echo StatusCodes::{$variable} // Output: 404
有了这个,我们可以从类中动态调用常量,我喜欢这个功能。
4. Introducing Read-Only Modifications
引入只读修改
“本提案的目标:克服对深度克隆只读属性的限制”
此建议有助于在 the__clone()magic 方法调用范围内重新初始化只读属性。下面是此增强功能的说明性示例.
8.3 之前
class Example {
public readonly $readOnlyProp = 'Initial Value';
}
$instance = new Example();
$instance->readOnlyProp = 'New Value'; // this will not work
class Example {
public function __construct(
public readonly string $readOnlyProp,
) {}
public function __clone()
{
$this->readOnlyProp = clone $this->readOnlyProp; // Doesn't work, an error is thrown.
}
}
8.3 之后
class Foo {
public function __construct(
public readonly string $example,
public readonly string $foo
) {}
public function __clone()
{
$this->example = clone $this->example; // Works.
$this->cloneFoo();
}
private function cloneFoo()
{
unset($this->foo); // Also works.
}
}
$foo = new Foo('Test', 'Example');
$foo2 = clone $foo;
// No error, Foo2::example is cloned deeply, while Foo2::$foo becomes uninitialized.
5. Typed Constants
众所周知,在 8.3 之前,我们定义了常量,但没有指定类型。就像下面一样
class Example
{
const HTTP_STATUS_OK = 200;
}
您现在可以键入提示类常量
class Example
{
const int HTTP_STATUS_OK = 200;
}
PHP
网站开发
小程序开发
阅读排行
-
1. 微信支付商户申请接入流程
微信支付,是微信向有出售物品/提供服务需求的商家提供推广销售、支付收款、经营分析的整套解决方案,包括多种支付方式,如JSAPI支付、小程序支付、APP支付H5支付等支付方式接入。
查看详情 -
2. 微信小程序申请注册流程
微信小程序注册流程与微信公众号较为相似,同时微信小程序支持通过已认证的微信公众号进行注册申请,无需进行单独认证即可使用,同一个已认证微信公众号可同时绑定注册多个小程序。
查看详情 -
3. 阿里云域名ICP网络备案流程
根据《互联网信息服务管理办法》以及《非经营性互联网信息服务备案管理办法》,国家对非经营性互联网信息服务实行备案制度,对经营性互联网信息服务实行许可制度。
查看详情 -
4. 浙江省同区域公司地址变更详细流程
提前准备好所有需要的资料,包含:房屋租赁合同、房产证、营业执照正副本、代理人身份证正反面、承诺书(由于我们公司其中一区域已有注册另外一公司,所以必须需要承诺书)
查看详情 -
5. 几行代码就能实现Html大转盘抽奖
大转盘抽奖是网络互动营销的一种常见形式,其通过简单易懂的界面设计,让用户在游戏中体验到乐趣,同时也能增加商家与用户之间的互动。本文将详细介绍如何使用HTML,CSS和JavaScript来实现大转盘抽奖的功能。
查看详情