🇩🇪 PHP 8.4:是新的吗?

2024 年 11 月 21 日,PHP 版本已发布。 **PHP 8.4** 带来了新的有趣的新体验和类似的体验。 Ein paar davon werde ich in diesem Beiträg näher vorstellen。

属性挂钩

**属性挂钩** gehören mit zu den größten änderungen in der jüngsten PHP Vergangenheit - doch was sind **属性挂钩** überhaupt? Es kommt oft vor, dass man for Eigenschaften unterschiedliche Sichtbarkeiten oder Logiken for den lesenden schreibenden Zugriff braucht. Bisher hieß das meistens,dass man dafür eigene Methoden geschrieben oder die magischen Methoden und benutzt hat。 **属性挂钩** sollen dafür nun eine native Lösungen bieten und überflüssigen Boilerplate Code verhindern。这个想法是不存在的,而且它的语法本身就是一种鼓舞人心的语言。

class User
{
    public string $fullName {
        // Lesezugriff/Getter überschreiben
        get => $this->firstName . " " . $this->lastName
    }

    public string $firstName {
        // Schreibzugriff/Setter überschreiben. $value ist der zu setzende Wert.
        set {
            if (empty($value)) {
                throw new ValueError("Lastname must not be empty");
            }
            $this->firstName = $value;
        }
        get => $this->firstName;
    }

    public string $lastName {
        set {
            if (empty($value)) {
                throw new ValueError("Lastname must not be empty");
            }
            $this->lastName = $value;
        }
        get => $this->lastName;
    }

    public function __construct(string $firstName, string $lastName)
    {
        $this->firstName = $firstName;
        $this->lastName = $lastName;
    }
}

挂钩是可选的并且不适合变型。我已经知道了`$fullName` einer,所以您可以使用`get` Hook vorhanden ist。 Eine weitere interessante Tatsache ist, dass **属性挂钩** auch in Interfaces benutzt werden können:

interface HasFullName
{
    // Objekte die dieses Interface implementieren müssen eine lesbare $fullName Eigenschaft haben.
    // Das kann entweder eine traditionelle Eigenschaft oder ein "get" property hook sein.
    public string $fullName { get; }
}

class User implements HasFullName
{
    // Implementiert `HasFullName`, da $fullName eine lesbare Eigenschaft ist.
    public function __construct(public readonly string $fullName)
    {
    }
}

**RCF:**https://wiki.php.net/rfc/property-hooks

新无克莱门特

这是一个与 **PHP 8.4** 相关的代码和样板代码缩减:Aufrufe 与 Klammern eingeschlossen werden 中的“new” müssen nicht mehr,um Methoden mit ihnen zu verketten。

// Vor PHP 8.4
$name = (new ReflectionClass($objectOrClass))->getShortName();

// Ab PHP 8.4
$name = new ReflectionClass($objectOrClass)->getShortName();

Die änderung betrifft aber nicht nur Methoden sondern funktioniert auch für Eigenschaften, Konstanten, statische Methoden etc.

**RCF:**https://wiki.php.net/rfc/new_without_parentheses

安德龙根 JIT

**PHP 8.4** 可以通过 JIT 激活来取消激活。必须将“opcache.jit_buffer_size”设置为“0”,然后取消 JIT。新 PHP 版本包含额外说明:

opcache.jit=disable
opcache.jit_buffer_size=64m

**RCF:**https://wiki.php.net/rfc/jit_config_defaults

新的 HTML5 支持

在 15 年前,PHP 的jetzt 已经存在,并且没有任何其他功能。 Mit **PHP 8.4** wird nun die neue Klasse `\Dom\HTMLDocument` eingeführt,welche HTML5 代码 vernünftig 解析 soll。旧的 `\DOMDocument` 类,是 HTML 4 理论中的一部分,是一个完全兼容的概念。

$doc = \Dom\HTMLDocument::createFromString($contents);

**RCF:**https://wiki.php.net/rfc/domdocument_html5_parser

新数组方法:array_find

PHP 8.4 中的框架是 Hilfsfunktionen schon etwas länger,sodass man es kaum glauben mag,dass `array_find` tatsächlich eine neue Funktion。

Der Name mag evtl。这是因为,“array_find”是最初的(!) Element aus einem Array zurückliefert auf das eine bestimmte Bedingung zutrifft。

// Findet den ersten Benutzer mit mehr als 10 Zeichen im Namen
$user = array_find($users, function (User $user) {
    return strlen($user->name) > 10;
});

`array_find` 的功能包括:`array_find_key`、`array_any` 和 `array_all`。 Wenn du mehr darüber erfahren möchtest, dann schaue dir doch den Beitrag an。

**RCF:**https://wiki.php.net/rfc/array_find

隐式可空参数类型

PHP 是一个复杂的版本,它是一个典型的变量,它是 Standardwert“null”帽子,自动 nullbar gemacht wurde。

function foo(Bar $bar = null) {} // Veraltet! Wurde von PHP automatisch umgewandelt

Dieses Verhalten ist jetzt veraltet und mit **PHP 9** entfernt werden。参数设置中的参数显示为 nullbar ausgewiesen werden。

function foo(?Bar $bar = null) {}

**弃用**:https://wiki.php.net/rfc/deprecate-implicitly-nullable-types