糯麦 NurMai

400-158-5662

糯麦科技

/

新闻资讯

/

技术讨论

/

探索 PHP 8.3 中的新功能与增强功能

探索 PHP 8.3 中的新功能与增强功能

原创 新闻资讯

于 2023-11-21 10:36:39 发布

14908 浏览

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. 微信支付商户申请接入流程

    微信支付,是微信向有出售物品/提供服务需求的商家提供推广销售、支付收款、经营分析的整套解决方案,包括多种支付方式,如JSAPI支付、小程序支付、APP支付H5支付等支付方式接入。

    查看详情
  • 3. 浙江省同区域公司地址变更详细流程

    提前准备好所有需要的资料,包含:房屋租赁合同、房产证、营业执照正副本、代理人身份证正反面、承诺书(由于我们公司其中一区域已有注册另外一公司,所以必须需要承诺书)

    查看详情
  • 4. 阿里云域名ICP网络备案流程

    根据《互联网信息服务管理办法》以及《非经营性互联网信息服务备案管理办法》,国家对非经营性互联网信息服务实行备案制度,对经营性互联网信息服务实行许可制度。

    查看详情
  • 5. 微信小程序申请注册流程

    微信小程序注册流程与微信公众号较为相似,同时微信小程序支持通过已认证的微信公众号进行注册申请,无需进行单独认证即可使用,同一个已认证微信公众号可同时绑定注册多个小程序。

    查看详情