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

不推举利用动态属性

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

php大括号七爪源码即将到来的 PHP 82 中的弃用和你必需知道的 Node.js

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 实体。

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

BASE64UUENCODEHTML-ENTITIEShtml (alias of HTML-ENTITIES)Quoted-Printableqprint (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 ...

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