PHP 8.3新功能全解析,必备的开发利器,赶紧收藏!
现在PHP可以轻松地使用原生PHP进行桌面编程。当然,以前有许多其他工具可用于在桌面编程中使用PHP,但我觉得原生PHP比它们更酷。无论如何,让我们开始深入了解我们的功能。
JSON验证
在开发新项目时,我们经常需要验证字符串是否为JSON。现在,PHP添加了一个本地方法来验证字符串是否为JSON。这个功能真的很酷。例如,我们可以这样使用它:
$json = '{ "example": "title" }';
$is_json = false;
if (json_validate($json)) {
// 有效的JSON
$is_json = true;
}
// 或者更好的方法
$is_json = json_validate($json);
目前,大多数PHP程序员使用json_decode()
函数来执行此任务,但这会使用不必要的内存和处理能力来检查有效性。实际上,验证JSON字符串并不需要使用json_decode
。
改进的unserialize()错误处理
unserialize()
目前在处理错误时缺乏一致性,它可能生成E_NOTICE、E_WARNING
,甚至根据输入字符串的格式错误抛出不可预测的Exception或Error。但是,新的PHP功能将解决这个问题。下面是一个示例:
在建议的之前,我们在PHP中处理反序列化错误的过程可能类似于以下内容:
try {
set_error_handler(static function ($severity, $message, $file, $line) {
throw \ErrorException($message, 0, $severity, $file, $line);
});
$result = unserialize($serialized);
} catch (\Throwable $e) {
// 如果要处理非序列化错误,可选的catch代码块。
} finally {
restore_error_handler();
}
var_dump($result);
在这个新功能之后,我们可以这样使用unserialize()
函数:
function unserialize(string $data, array $options = []): mixed
{
try {
// 现有的非列化逻辑在这里发生。
} catch (\Throwable $e) {
throw new \UnserializationFailedException(previous: $e);
}
}
并且UnserializationFailedException的实现如下:
class UnserializationFailedException extends \Exception
{
}
这真是超级酷!
动态提取类常量
在8.3之前,我们不能通过变量获取基于类的常量。当我们调用它们时,应该直接添加常量名。但在8.3中,我们可以使用变量来提取常量。下面是一个示例:
class StatusCodes {
const OK = 200;
const NOT_FOUND = 404;
const INTERNAL_ERROR = 500;
const UNAUTHORIZED = 401;
const FORBIDDEN = 403;
}
// 访问常量
echo StatusCodes::OK; // 输出: 200
echo StatusCodesNOT_FOUND; // 输出: 404
echo StatusCodes::INTERNAL_ERROR; // 输出: 500
echo StatusCodes::UNAUTHORIZED; // 输出: 401
echo StatusCodes::FORBIDDEN; // 输出: 403
这样,我们可以动态地从类中调用常量,我真的很喜欢这个功能。
引入只读修改
这个提案的目标是克服只读属性在深度克隆时的限制。在8.3之前,只读属性在__clone()
魔法方法调用范围内不能重新初始化。但是在8.3之后,我们可以在__clone
方法中重新初始化只读属性。下面是一个示例:
在8.3之前:
class Example {
public readonly $readOnlyProp '初始值';
}
$instance = new Example();
$instance->readOnlyProp = 'New Value'; // 这行不通
class Example {
public function __construct(
public readonly string $readOnly,
) {}
public function __clone()
{
$this->readOnlyProp = clone $this->readOnlyProp; // 不起作用会出现错误。
}
}
在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); // 也可以使用
}
}
$foo = new Foo('Test', 'Example');
$foo2 = clone $foo;
// 没有错误,Foo2::$example被深度克隆,而Foo2::$foo变为未初始化。
类型化常量
在8.3之前,我们定义常量时没有指定类型。但是在8.3之后,我们可以为类常量指定类型。下面是一个示例:
class Example
{
const HTTP_STATUS_OK:int = 200;
}
这些是PHP的一些酷炫功能,让桌面编程更加简单和有趣。现在你可以尝试使用这些新功能来提升你的编程体验。祝你好运!
发表评论