PHP8.2新特性

trait 常量

在PHP 8.2之前,不允许将常量添加到trait中。这是一种语言差异,因为trait可以访问使用它们的类的常量。
但是你不能严格地定义一个常量存在于一个类中,次问题已经在PHP 8.2修复。

<?php

trait testTrait
{
    private const NAME = 'apple';
}

只读类

PHP 8.1引入了readonly类属性的特性。现在,PHP 8.2增加了将整个类声明为readonly。
如果你将一个类声明为readonly,它的所有属性都会自动继承这个readonly特性。因此,声明一个类readonly与将每个类属性声明为readonly.

PHP 8.1中

<?php

class MyClass
{
    public readonly string $myValue;
    public readonly int $myOtherValue;
    public readonly string $myAnotherValue;
    public readonly int $myYetAnotherValue;
}

PHP 8.2中

<?php

readonly class MyClass
{
    public string $myValue;
    public int $myOtherValue;
    public string $myAnotherValue;
    public int $myYetAnotherValue;
}

您还可以将抽象类或最终类声明为readonly。

<?php

abstract readonly class Free {}
final readonly class Dom {}

readonly类只能包含类型化的属性——声明单个readonly属性的规则相同。

<?php

readonly class Type {
    public $nope;
}

Fatal error: Readonly property Type::$nope must have type in ... on line ...

移除动态属性

PHP一直具有动态特性。社区认为,在过去的几年里,该语言最早的一些特性过于动态。动态属性提供了看不见的灵活性,但也为意想不到的行为打开了大门,从而导致难以修复的错误。这种动态特性的一个很好的例子是动态属性。允许在任何对象上设置类中不存在的属性。

<?php

class User{}

$user = new User();
$user->email = 'info@spatie.be';

假设您在某处重命名此属性。然后你要找到所有使用这个属性的地方,因为它需要重命名。
静态分析和IDE在这里可以为您提供一些帮助。但是在你的类中定义属性,总比动态设置更好掌握之中。而且您可能也会写出更少的错误。
此外,读取未定义在类的属性会给你反馈,因为你会收到警告。而添加未定义的属性到类可以在没有任何警告的情况下完成。
PHP需要一个稳定的类型系统。动态属性违反了这条规则,这就是PHP不使用它们的原因。
从PHP 8.2开始,动态属性被弃用。上面的示例现在将抛出弃用警告。当您实现魔法__get()__set()
方法时,获取和设置对象的动态属性仍然有效。但您仍然可以通过将 AllowDynamicProperties 属性添加到类来启用动态属性的功能。

<?php

#[AllowDynamicProperties]
class User{}

$user = new User();
$user->email = 'web@myfreax.com';

最后,只读类永远不能有动态属性。将 AllowDynamicProperties 属性添加到只读类将导致错误。

允许 true、 false和 null作为独立类型

PHP已经包含标量类型,如int,string和bool. 这在PHP 8.0中通过添加union types进行了扩展,允许值具有不同的类型。同一个RFC也允许使用 false and null作为联合类型的一部分——尽管它们不允许作为独立类型。
如果您尝试将falseor声明null为独立类型(而不将它们作为联合类型的一部分),则会导致致命错误。

PHP 8.1中

<?php

function spam(): null {}
function eggs(): false {}
Fatal error: Null can not be used as a standalone type in ... on line ...
Fatal error: False can not be used as a standalone type in ... on line ...

为了避免这种情况,PHP 8.2添加了对使用false和null作为独立类型的支持。通过这个添加,PHP的类型系统更具表现力和完整。您现在可以精确地声明返回、参数和属性类型。

PHP 8.2中

<?php

function test() : true|null
{
    return true;
}

字符串插值弃用

字符串插值是一个很棒的功能,它允许您像这样 "Hello there, {$name}" 在字符串中使用变量。
你也可以这样做 "Hello there, ${name}" 。尽管语法看起来几乎相同,但其行为却大不相同。
由于这些语义差异和使用字符串插值缺陷,该功能在PHP 8.2发布时被弃用。

<?php

"Hello there, {$name}";
"Hello there, ${name};    // 弃用

从PHP 9.0开始,这些弃用将升级为抛出异常错误。

析取范式 (DNF) 类型

析取范式 (DNF)是一种组织布尔表达式的标准化方法。它由连词的析取组成——用布尔术语来说,这是OR of ANDs。
将DNF应用于类型声明允许以标准方式编写解析器可以处理的联合和交集类型。如果使用得当, PHP 8.2的新DNF类型功能既简单又强大。
RFC给出了以下示例。它假定以下接口和类定义已经存在:

<?php

interface A {}
interface B {}
interface C extends A {}
interface D {}
class W implements A {}
class X implements B {}
class Y implements A, B {}
class Z extends Y implements C {}

// Accepts an object that implements both A and B,
// OR an object that implements D
// (A&B)|D
// Accepts an object that implements C,
// OR a child of X that also implements D,
// OR null
// C|(X&D)|null
// Accepts an object that implements all three of A, B, and D,
// OR an int,
// OR null.
// (A&B&D)|int|null

function test((A&B)|D $a): true
{
    return true;
}

获取表达式enum中的属性const

这个新特性的主要原因是你不能在某些地方使用enum对象,比如数组键。在这种情况下,您必须重复enum实例的值才能使用它。
允许在不允许enum对象的地方获取enum属性可以简化此过程。

<?php

enum UserRole: string
{
    case ADMIN    = "1";
    case GUEST    = "2";
    case WRITER   = "3";
    case EDITOR   = "4";

    const ROLE_LIST = [
        self::ADMIN->value => self::ADMIN,
        self::GUEST->value => self::GUEST,
        self::WRITER->value => self::WRITER,
        self::EDITOR->value => self::EDITOR,
    ];
}

echo in_array(UserRole::EDITOR, UserRole::ROLE_LIST);

新mysqli_execute_query功能和mysqli::execute_query方法

PHP 8.2使用新的mysqli_execute_query($sql, $params)函数和mysqli::execute_query方法使运行参数化MySQLi查询变得更加容易。
本质上,这个新函数是mysqli_prepare()mysqli_execute()mysqli_stmt_get_result()函数的组合。有了它,MySQLi查询将准备好、绑定(如果您传递任何参数),并在函数本身内执行。如果查询成功运行,它将返回一个mysqli_result对象。如果不成功,它将返回false。

<?php

foreach ($db->execute_query('SELECT * FROM user WHERE name LIKE ? AND type_id IN (?, ?)', [$name, $type1, $type2]) as $row) {
print_r($row);
}

随机扩展

PHP 8.2内置一个新的扩展,它增加了一种更适合OOP的方式来处理随机数生成和其他随机化操作。
启用此特性。您可以使用此特性来打乱字符串或者打乱一个数组,在指定的数值范围获取随机数。

<?php

use Random\Randomizer;

$randomizer = new Randomizer();

$randomizer->shuffleBytes('Hello World'); // example output: "eWrdllHoo l"

$randomizer->shuffleBytes(['a', 'b', 'c', 'd']); // example output: ['b', 'd', 'a', 'c']

$randomizer->getInt(0, 100); // example output: 42

重置内存峰值函数

在PHP,可以测量峰值内存使用情况。以前不可能重置此峰值,因此不可能在第一个峰值之后测量第二个峰值。
在PHP 8.2添加 memory_reset_peak_usage 函数,允许您重置此内存峰值,以便您可以再次测量它。
例如,当您创建两个数组并想要测量第二个数组的内存使用峰值时,该值将等于创建第一个数组时的内存使用峰值。

<?php

range(0, 100000);
memory_get_peak_usage(); // 2509760
range(0, 100);
memory_get_peak_usage(); // 2509760
<?php

range(0, 100000);
memory_get_peak_usage(); // 2509760
memory_reset_peak_usage();
range(0, 100);
memory_get_peak_usage(); // 398792

弃用utf8_encode()和utf8_decode()函数

PHP 8.2弃用了utf8_encode()utf8_decode()函数。如果您调用它们,您将看到这些弃用通知:

Deprecated: Function utf8_encode() is deprecated
Deprecated: Function utf8_decode() is deprecated

RFC建议使用PHP支持的扩展,例如mbstringiconvintl

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇