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

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

喜欢就支持以下吧
点赞 0

发表评论

快捷回复: 表情:
aoman baiyan bishi bizui cahan ciya dabing daku deyi doge fadai fanu fendou ganga guzhang haixiu hanxiao zuohengheng zhuakuang zhouma zhemo zhayanjian zaijian yun youhengheng yiwen yinxian xu xieyanxiao xiaoku xiaojiujie xia wunai wozuimei weixiao weiqu tuosai tu touxiao tiaopi shui se saorao qiudale qinqin qiaoda piezui penxue nanguo liulei liuhan lenghan leiben kun kuaikule ku koubi kelian keai jingya jingxi jingkong jie huaixiao haqian aini OK qiang quantou shengli woshou gouyin baoquan aixin bangbangtang xiaoyanger xigua hexie pijiu lanqiu juhua hecai haobang caidao baojin chi dan kulou shuai shouqiang yangtuo youling
提交
评论列表 (有 0 条评论, 428人围观)

最近发表

热门文章

最新留言

热门推荐

标签列表