探索 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. 几行代码就能实现Html大转盘抽奖
大转盘抽奖是网络互动营销的一种常见形式,其通过简单易懂的界面设计,让用户在游戏中体验到乐趣,同时也能增加商家与用户之间的互动。本文将详细介绍如何使用HTML,CSS和JavaScript来实现大转盘抽奖的功能。
查看详情 -
2. 浙江省同区域公司地址变更详细流程
提前准备好所有需要的资料,包含:房屋租赁合同、房产证、营业执照正副本、代理人身份证正反面、承诺书(由于我们公司其中一区域已有注册另外一公司,所以必须需要承诺书)
查看详情 -
3. 微信支付商户申请接入流程
微信支付,是微信向有出售物品/提供服务需求的商家提供推广销售、支付收款、经营分析的整套解决方案,包括多种支付方式,如JSAPI支付、小程序支付、APP支付H5支付等支付方式接入。
查看详情 -
4. 阿里云域名ICP网络备案流程
根据《互联网信息服务管理办法》以及《非经营性互联网信息服务备案管理办法》,国家对非经营性互联网信息服务实行备案制度,对经营性互联网信息服务实行许可制度。
查看详情 -
5. 微信小程序申请注册流程
微信小程序注册流程与微信公众号较为相似,同时微信小程序支持通过已认证的微信公众号进行注册申请,无需进行单独认证即可使用,同一个已认证微信公众号可同时绑定注册多个小程序。
查看详情