Skip to content

PHP 8.4

PHP 8.4 将于 2024 年 11 月 21 日发布。主要包括如下新特性:

  • 新的数组查找函数
  • Property Hooks
  • new 不带括号
  • 新 DOM HTML5 支持

新的数组查找函数

PHP 8.4将引入四个新的数组函数,它们是用于检查数组中是否存在符合特定条件的元素的辅助函数。新函数包括:

  • array_find()
  • array_find_key()
  • array_any()
  • array_all()

array_find()

array_find() 函数返回数组中第一个满足指定条件的元素的值。如果没有找到符合条件的元素,则返回 null

php
<?php

$array = [
    'a' => 'dog',
    'b' => 'cat',
    'c' => 'cow',
    'd' => 'duck',
    'e' => 'goose',
    'f' => 'elephant'
];

array_find($array, fn(string $value) => strlen($value) > 4); // "goose"

array_find($array, fn(string $value) => str_starts_with($value, 'f')); // null

// 找到数组键为该动物第一个字符的第一个动物
array_find($array, fn(string $value, $key) => $value[0] === $key); // "cow"

相当于 Collectionfirst() 方法。

array_find_key()

array_find_key() 函数返回数组中第一个满足指定条件的元素的键。如果没有找到符合条件的元素,则返回 null

php
<?php
$array = [
    'a' => 'dog',
    'b' => 'cat',
    'c' => 'cow',
    'd' => 'duck',
    'e' => 'goose',
    'f' => 'elephant'
];

array_find_key($array, fn(string $value) => strlen($value) > 4); // string(1) "e"

array_find_key($array, fn(string $value) => str_starts_with($value, 'f')); // null

array_find_key($array, fn(string $value, $key) => $value[0] === $key); // string(1) "c"

相当于 Collectionsearch() 方法。

array_any()

array_any() 函数检查数组中是否存在至少一个满足指定条件的元素。如果找到符合条件的元素,则返回 true,否则返回 false

php
$array = [
    'a' => 'dog',
    'b' => 'cat',
    'c' => 'cow',
    'd' => 'duck',
    'e' => 'goose',
    'f' => 'elephant'
];

// 检查是否有任何动物的名字超过5个字母
array_any($array, fn (string $value) => strlen($value) > 5); // bool(true)

// 检查是否有任何动物的名字少于3个字母
array_any($array, fn (string $value) => strlen($value) < 3); // bool(false)

array_all()

array_all() 函数检查数组中的所有元素是否都满足指定条件。如果所有元素都满足条件,则返回 true,否则返回 false

php
$array = [
    'a' => 'dog',
    'b' => 'cat',
    'c' => 'cow',
    'd' => 'duck',
    'e' => 'goose',
    'f' => 'elephant'
];

// 检查是否所有数组值都少于12个字母
array_all($array, fn (string $value) => strlen($value) < 12); // bool(true)

// 检查是否所有数组值都超过5个字母
array_all($array, fn (string $value) => strlen($value) > 5); // bool(false)

Property Hooks

定义属性挂钩 Property Hooks 的能力,消除了对大量重复代码。

在类中定义

在类中定义属性的 gettersetter 让代码更简洁清晰。

php
<?php
class User
{
    public function __construct(public string $first, public string $last) {}

    public string $fullName {
        get {
            return "$this->first $this->last";
        }
        set (string $value) {
            [$this->first, $this->last] = explode(' ', $value, 2);
        }
    }

}

$u = new User('Larry', 'Garfield');

var_dump($u->fullName); // Larry Garfield

$u->fullName = 'Ilija Tovilo';

var_dump($u->first, $u->last); // "Ilija" "Tovilo"

在接口中定义

php
interface Named
{
    public string $fullName { get; set; }
}

详情可以参考这个 rfc

new 不带括号

实例化对象的同时调用常量、属性、静态方法、方法和魔术方法可以不用括号包裹。

当前这个 rfc 正在投票状态。

php
<?php
class MyClass
{
    const CONSTANT = 'constant';
    public static $staticProperty = 'staticProperty';
    public static function staticMethod(): string { return 'staticMethod'; }
    public $property = 'property';
    public function method(): string { return 'method'; }
    public function __invoke(): string { return '__invoke'; }
}

var_dump(
    new MyClass()::CONSTANT,        // string(8)  "constant"
    new MyClass()::$staticProperty, // string(14) "staticProperty"
    new MyClass()::staticMethod(),  // string(12) "staticMethod"
    new MyClass()->property,        // string(8)  "property"
    new MyClass()->method(),        // string(6)  "method"
    new MyClass()(),                // string(8)  "__invoke"
);

新 DOM HTML5 支持

PHP 8.4 添加了一个 \DOM\HTMLDocument 能够正确解析 HTML5 代码的类,旧 \DOMDocument 类仍然可用于向后兼容。

php
$doc = new \DOM\HTMLDocument();

$doc->loadHTML($contents);

MIT Licensed