您的位置 首页 php

七爪源码:即将到来的 PHP 8.2 中的弃用和你必须知道的

PHP 团队在每个版本中都带来了新功能和修复。 但它并不总是功能和修复。 有时团队不得不做出艰难的决定,放弃一些特性来标准化语言,我们称之为弃用。 在 PHP 8.2 中也有一些弃用。

不推荐使用动态属性

在 PHP 类中可以动态设置和获取您不必在类中声明的属性。

 class FooBar {
    public string $bar;
}

$fooBar = new FooBar();
$fooBar->foo = 'Foo';  

您只能使用 __set() 和 __get() 魔术方法来防止这种行为。

在 PHP 8.2 或更高版本中,不推荐为未声明的类属性设置值,并在应用程序执行的生命周期内首次设置该属性时发出弃用通知。

 class FooBar {
    public string $bar;
}$fooBar = new FooBar();
$fooBar->foo = 'Foo';  

这将生成如下所示的弃用通知。

 Deprecated: Creation of dynamic property FooBar::$foo is deprecated in ... on line ...  

在 PHP 9 中它会导致致命错误。

动机:尽管类中的动态属性允许开发人员设置和检索它,但它也打开了应用程序中潜在错误和意外行为的可能性。例如,设置属性的语句中的拼写错误可能会被忽视,因为 PHP 静默允许所有动态属性。

问题是很多库和框架依赖于动态属性。以 Laravel Elquent ORM 为例,它的属性和关系严重依赖动态属性。所以随着这个弃用 Laravel 框架将面临大量的重写。

此弃用存在三个例外。

1. 具有#[AllowDynamicProperties] 属性的类。

使用 PHP 8.2 中引入的这个新属性,您可以阻止 PHP 发出弃用通知。甚至该类的子类也会继承这种行为。

2.stdClass及其子类

stdClass 已经定义了 #[AllowDynamicProperties] 属性,因此 stdClass 及其任何子类都将允许动态属性

3. 带有 __get 和 __set 魔术方法的类

如果一个类定义了 __set() 魔术方法,它将免除此弃用。您最终可以添加一个 __get() 方法来创建一个实用的类。

 class FooBar {
    public function __set(string $name, mixed $value):  void  {}
}$fooBar = new FooBar();
$fooBar->foo = 'Foo';  

但是仍然不允许在 __set() 中设置动态属性。

 class FooBar {
    public function __set(string $name, mixed $value): void {
        $this->{$name} = $value;
    }
}$fooBar = new FooBar();
$fooBar->foo = 'foo';  

以上是不允许的,因为我们在 __set() 魔术方法中设置动态属性。 它会抛出相同的弃用通知

 Deprecated: Creation of dynamic property FooBar::$foo is deprecated in ... on line ...  

部分支持的可调用对象已弃用

PHP 8.2 弃用了某些不适用于 $callable() 模式的可调用对象模式。

不受影响的可调用模式

 $callable = 'strlen';
$callable = ['MyClass', 'myMethod'];
$callable = 'MyClass::myMethod'];
$callable = Closure::fromCallable();
$callable = [$this, 'myMethod'];
$callable = [new MyClass(), 'myMethod'];
$callable = strlen(...);  

这些是可以在没有任何弃用警告的情况下工作的可调用模式。

已弃用的可调用模式

 $callable = "self::method";
$callable = "parent::method";
$callable = " static ::method";
$callable = ["self", "method"];
$callable = ["parent", "method"];
$callable = ["static", "method"];
$callable = ["MyClass", "MyParentClass::myMethod"];
$callable = [new MyClass(), "MyOtherClass::myMethod"];  

因此,如果您尝试以上述方式使用 callable,它将引发弃用通知。

Mbstring:Base64、Uuencode、QPrint 和 html 实体编码已弃用

PHP 的多字节字符串扩展 (mbstring) 添加了操作 PHP 字符串的功能,这些 字符串 包含多字节字符,例如来自亚洲文字、表情符号的字符以及数以千计的其他无法分配并适合单个字节的字符。

在 PHP 8.2 中,不推荐使用 Mbstring 扩展将字符串编码/解码为 Base64、Quoted-Printable、Uuencode 和 HTML 实体。

以下标记的编码受到影响。 编码 标签不区分大小写。

 BASE64
UUENCODE
HTML-ENTITIES
html (alias of HTML-ENTITIES)
Quoted-Printable
qprint (alias of Quoted-Printable)  

这样做的原因是,PHP 核心已经为这些功能提供了替代方案。 例如

 mb_convert_encoding('test', 'base64'));  

您可以使用 base64_encode(‘test’) 实现相同的目的

不推荐使用 ${var} 字符串插值

在 PHP 中,可以用 双引号 和 heredoc 语法替换字符串文字中的变量。

 $name = 'PHP';
echo "Hello $name"; // Hello PHP  

为了更好的可读性,您还可以在变量周围添加 {}。 但是 PHP 也支持大括号之外的美元符号。

 echo "Hello ${name}";  

但这在 php 8.2 中已被弃用。

 Deprecated: Using ${var} in strings is deprecated, use {$var} instead in ... on line ...  

想要更多这样的内容,请考虑关注我

文章来源:智云一二三科技

文章标题:七爪源码:即将到来的 PHP 8.2 中的弃用和你必须知道的

文章地址:https://www.zhihuclub.com/150235.shtml

关于作者: 智云科技

热门文章

网站地图