PHP 8.1 编程语言发布

经过一年的开发,PHP 8.1 编程语言发布了。 新分支包含一系列新功能,以及一些破坏兼容性的更改。

PHP 8.1 的主要改进:

  • 添加了对枚举的支持,例如,您现在可以使用以下结构: enum Status { case Pending; 案例活跃; 案例已存档; } class Post { public function __construct( private Status $status = Status::Pending; ) {} public function setStatus(Status $status): void { // … } } $post->setStatus(Status::Active);
  • 添加了对称为 Fibers 的轻量级线程的支持,它允许您在较低级别管理执行线程。 计划将 Fiber 支持添加到 Amphp 和 ReactPHP 框架中。 $ Fiber = new Fiber(function (): void { $valueAfterResuming = Fiber::suspend('暂停后'); // ... }); $valueAfterSuspending = $fibre->start(); $ Fiber->resume('恢复后');
  • 目标代码缓存(opcache)的实现已得到改进,使得缓存有关类继承的信息成为可能。 优化可以将某些应用程序的性能提高 5-8%。 其他优化包括JIT操作的优化、ARM64架构(AArch64)的JIT支持的实现、名称解析加速、timelib和ext/date库的优化、序列化和反序列化性能的提高、get_declared_classes()、explode()的优化、strtr() 函数、strnatcmp()、dechex()。 总体而言,Symfony Demo 的性能提升了 23.0%,WordPress 的性能提升了 3.5%。
  • 数组“...$var”内的解包运算符允许在定义新数组时替换现有数组,已扩展为支持字符串键(以前仅支持数字标识符)。 例如,您现在可以在代码中使用: $array1 = [“a” => 1]; $array2 = ["b" => 2]; $array = [“a” => 0, …$array1, …$array2]; var_dump($数组); // [“a”=> 1,“b”=> 2]
  • 允许在初始化程序中使用“new”关键字,例如在函数定义中作为默认参数或在参数属性中。 类 MyController { public function __construct( private Logger $logger = new NullLogger(), ) {} }
  • 可以将类属性标记为只读访问(此类属性中的信息只能写入一次,之后将无法更改)。 class PostData { public function __construct( public readonly string $title, public readonly DateTimeImmutable $date, ) {} } $post = new Post('Title', /* … */); $post->title = '其他'; > 错误:无法修改只读属性 Post::$title
  • 可调用对象实现了新语法 - 现在可以通过调用函数并将值“...”作为参数传递给它来形成闭包(即 myFunc(...) 而不是 Closure::fromCallable('myFunc) ')): function foo (int $a, int $b) { /* ... */ } $foo = foo(...); $foo(a: 1, b: 2);
  • 添加了对交叉类型的全面支持,允许您通过组合现有类型来创建新类型。 与定义两个或多个类型的集合的联合类型不同,交集类型不需要存在任何列出的类型,而是需要填充集合中的所有指定类型。 函数generateSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) 。 $post->getId(); }
  • 有一种新类型“never”可用于通知静态分析器某个函数将终止程序执行,例如通过引发异常或执行退出函数。 函数 dd(mixed $input): never { exit; }
  • 提出了一个新函数 array_is_list,它允许您确定数组中的键从 0 开始按数值递增的顺序排列: $list = [“a”, “b”, “c”]; array_is_list($list); // true $notAList = [1 => “a”, 2 => “b”, 3 => “c”]; array_is_list($notAList); // false $alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"]; array_is_list($alsoNotAList); // 错误的
  • 您现在可以使用“final”关键字来防止父类常量被覆盖。 类 Foo { 最终 public const X = "foo"; } class Bar 扩展了 Foo { public const X = "bar"; > 致命错误:Bar::X 无法覆盖最终常量 Foo::X }
  • 建议使用 fsync 和 fdatasync 函数强制从磁盘缓存保存更改。 $file = fopen("sample.txt", "w"); fwrite($file, "部分内容"); if (fsync($file)) { echo "文件已成功保存到磁盘。"; fclose($文件);
  • 除了之前使用的前缀“0”之外,还添加了对八进制数使用前缀“0o”和“0O”的功能。 016 === 0o16; // 真 016 === 0O16; // 真的
  • 建议有选择地限制 $GLOBALS 的使用,这将导致向后兼容性的违反,但可以显着加快数组操作的速度。 例如,正在考虑禁用写入 $GLOBALS 并通过指针传递 $GLOBALS 的可能性。 对 2000 个软件包的分析显示,其中只有 23 个软件包会受到此更改的影响。 例如,如果提案获得批准,8.1 将不再支持以下表达式:$GLOBALS = []; $GLOBALS += []; $GLOBALS =& $x; $x =& $GLOBALS; 取消设置($GLOBALS); by_ref($GLOBALS);
  • 内部方法现在应该返回正确的类型。 在 PHP 8.1 中,返回与函数声明不匹配的类型将产生警告,但在 PHP 9.0 中,警告将替换为错误。
  • 将功能从使用资源转移到操作对象的工作仍在继续。 finfo_* 和 imap_* 函数已转移到对象。
  • 将空值作为参数传递给标记为不可空的内部函数已被弃用。 在 PHP 8.1 中,使用 str_contains(“string”, null) 等结构将导致警告,而在 PHP 9 中将导致错误。
  • 添加了对 MurmurHash3 和 xxHash 哈希算法的支持。

来源: opennet.ru

添加评论