PHP 8.3新功能全解析,必备的开发利器,赶紧收藏!

admin 2023-10-30 97 阅读 0评论

现在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的一些酷炫功能,让桌面编程更加简单和有趣。现在你可以尝试使用这些新功能来提升你的编程体验。祝你好运!

发表评论

快捷回复: 表情:
Addoil Applause Badlaugh Bomb Coffee Fabulous Facepalm Feces Frown Heyha Insidious KeepFighting NoProb PigHead Shocked Sinistersmile Slap Social Sweat Tolaugh Watermelon Witty Wow Yeah Yellowdog
提交
评论列表 (有 0 条评论, 97人围观)