PHP 8.4 发布,包含属性钩子、无需额外括号的类实例化等

PHP 8.4 发布,包含属性钩子、无需额外括号的类实例化等hello 呀 朋友们 许久不见了 因 php8 4 的发布 特回归我的头条来为 php 做做宣传 其实有看到很多关于 php 的评论 其中最多的评价都在说 PHP 老了 无法媲美正火的几种编程怨言 坚持就要饿死 有个评论感概到 廉颇老矣 尚能干 小编

大家好,欢迎来到IT知识分享网。

PHP 8.4 发布,包含属性钩子、无需额外括号的类实例化等

回归正题,小编放了最新的排行榜,从11月的编程语言排行榜来看,php活跃度有所增长。借着,我们来聊聊8.4给我带来了哪些特性吧。

PHP 8.4 发布,包含属性钩子、无需额外括号的类实例化等

更新一览表

PHP 团队发布了 PHP 8.4,其中包含新的数组查找函数、属性挂钩、无需额外括号的类实例化等:

  • PHP 8.4 中的新数组查找函数 (RFC)
  • PHP 8.4 中的属性挂钩 (RFC)
  • PHP 8.4 中无需额外括号的类实例化 (RFC)
  • 新 mb_trim 函数 (RFC)
  • 新 mb_ucfirst() 和 mb_lcfirst() 函数 (RFC)
  • PHP 8.4 中的非对称属性可见性 (RFC)
  • 还有更多…

具体可看RFC:https://wiki.php.net/rfc#php_84

PHP 8.4 发布,包含属性钩子、无需额外括号的类实例化等

属性钩子(Property Hooks)

现代 PHP 历史上最大的变化之一:能够定义属性钩子,从而无需大量样板代码。属性钩子受到 Kotlin、C# 和 Swift 等语言的启发,其语法包括两种类似于短闭包和多行闭包的语法变体:

案例1

class BookViewModel { public function __construct( private array $authors, ) {} public string $credits { get { return implode(', ', array_map( fn (Author $author) => $author->name, $this->authors, )); } } public Author $mainAuthor { set (Author $mainAuthor) { $this->authors[] = $mainAuthor; $this->mainAuthor = $mainAuthor; } get => $this->mainAuthor; } }
interface HasAuthors { public string $credits { get; } public Author $mainAuthor { get; set; } }

属性钩子的目标是通过允许每个属性定义自己的 get 和 set 钩子来删除大量的 getter 和 setter。钩子是可选的,您不必在特定属性上同时添加它们。例如,只有 get 钩子的属性是虚拟属性。

案例2

class User implements Named { private bool $isModified = false; public function __construct( private string $first, private string $last ) {} public string $fullName { // Override the "read" action with arbitrary logic. get => $this->first . " " . $this->last; // Override the "write" action with arbitrary logic. set { [$this->first, $this->last] = explode(' ', $value, 2); $this->isModified = true; } } }

属性钩子将有助于消除属性 getter 和 setter 的样板,允许属性使用钩子定义访问和更新。

新的数组查找函数

PHP 8.4 将附带新的数组查找函数,包括:

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

array_find()

PHP 8.4 中添加了一个非常简单的新函数,我想大多数开发人员已经习惯了第三方集合类,看着很亲切,和array_filter()也有相似之处。

array_find 返回 $callback 返回 true 的第一个元素的值。如果未找到匹配的元素,则函数返回 NULL

$firstMatch = array_find( $posts, function (Post $post) { return strlen($post->title) > 5; } ); #array_find 返回 $callback 返回 true 的第一个元素的值。如果未找到匹配的元素,则函数返回 NULL

new MyClass()->method()不带括号

由于引入了实例化期间的成员访问,因此必须将 new MyClass() 调用括在括号中,否则会出现解析错误。建议的语法将允许您访问常量、属性和方法,而无需额外的括号:

$name = (new ReflectionClass($objectOrClass))->getShortName(); # 8.4: $name = new ReflectionClass($objectOrClass)->getShortName();

此更新修复了 papercut,使类成员访问变得更简单,无需添加括号或使用静态构造函数方法。此语法更改还使 PHP 与其他 C 语言(如 Java、C# 和 TypeScript)更加一致,这些语言不需要括号。

根据 Unix 时间戳创建日期时间

在 PHP 8.4 中,使用新的 createFromTimestamp() 方法从 Unix 时间戳创建 DateTime 将更加方便。它将支持典型的 Unix 时间戳以及包含微秒的时间戳:

$dt = DateTimeImmutable::createFromTimestamp(); $dt->format('Y-m-d'); // 2024-11-26 $dt = DateTimeImmutable::createFromTimestamp(.432); $dt->format('Y-m-d h:i:s.u'); // 2024-11-26 11:54:12.

在早期版本的 PHP 中,有几种方法可以根据时间戳创建 DateTime 实例,例如 createFromFormat() 方法:

$dt = DateTimeImmutable::createFromFormat('U', (string) ); // date: 2024-11-26 11:54:12.0 +00:00, // } $dt = DateTimeImmutable::createFromFormat('U.u', (string) .432); // date: 2024-11-26 11:54:12.432 +00:00, // }

不对称可见性

PHP 8.4 的另一个突破性功能是不对称可见性。不对称可见性允许类属性根据读取或写入上下文定义其可见性(公共、受保护或私有)。不对称可见性的最常见示例是只能在类内部更改的公共属性。这样的属性如下所示:

class BookViewModel { public private(set) Author $author; }

因为“只能在私有上下文中更改的公共属性”是不对称可见性的最常见用例,所以也有可用的简写:

class BookViewModel { private(set) Author $author; // same as public private(set) }

当然,你也可以使属性仅在受保护的范围内可写:

class BookViewModel { public protected(set) Author $author; }

当然,该语法也适用于提升的属性:

public function __construct( private(set) Author $author; ) {}

新的 mb_ 函数

PHP 很早就有 trim、ltrim、rtrim、ucfirst 和 lcfirst 函数,现在 PHP 8.4 为这些函数添加了 mb_ 多字节字符串支持。

  • mb_trim()
  • mb_ltrim()
  • mb_rtrim()
  • mb_ucfirst()
  • mb_lcfirst()

新的 HTML5 支持

PHP 8.4 添加了 \Dom\HTMLDocument 类,该类能够正确解析 HTML5 代码。旧版 \DOMDocument 类仍可用,以实现向后兼容。

 $dom = Dom\HTMLDocument::createFromString( <<<HTML <main> <article>PHP 8.4 is a feature-rich release!</article> <article class="featured">PHP 8.4 adds new DOM classes that are spec-compliant, keeping the old ones for compatibility.</article> </main> HTML, LIBXML_NOERROR, ); $node = $dom->querySelector('main > article:last-child'); var_dump($node->classList->contains("featured")); // bool(true)

< 8.4

$dom = new DOMDocument(); $dom->loadHTML( <<<'HTML' <main> <article>PHP 8.4 is a feature-rich release!</article> <article class="featured">PHP 8.4 adds new DOM classes that are spec-compliant, keeping the old ones for compatibility.</article> </main> HTML, LIBXML_NOERROR, ); $xpath = new DOMXPath($dom); $node = $xpath->query(".//main/article[not(following-sibling::*)]")[0]; $classes = explode(" ", $node->className); // Simplified var_dump(in_array("featured", $classes)); // bool(true)

JIT 变更

PHP 8.4 改变了 JIT 的启用方式。以前,您必须将 opcache.jit_buffer_size 设置为 0 才能禁用 JIT,但现在您可以像这样禁用它:

opcache.jit=disable opcache.jit_buffer_size=64m

用户唯一会受到此更改影响的情况是,他们指定了 opcache.jit_buffer_size,但没有指定 opcache.jit。在这种情况下,您必须添加 opcache.jit=tracing 才能再次启用 JIT。

最后,JIT 也进行了一些改进,在某些情况下,JIT 的运行速度更快,并且占用的内存更少。

惰性对象

PHP 8.4 添加了对惰性对象的原生支持,这是框架用于构建代理对象的常见模式。

$initializer = static function (MyClass $proxy): MyClass { return new MyClass(123); }; $reflector = new ReflectionClass(MyClass::class); $object = $reflector->newLazyProxy($initializer);

总结

总之,8.4带来了很多新特性,更多内容参考:https://www.php.net/releases/8.4/zh.php。同时,本文内容参考自:

  • https://www.php.net/releases/8.4/zh.php
  • https://laravel-news.com/php-8-4-0
  • https://stitcher.io/blog/new-in-php-84

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/163512.html

(0)
上一篇 2024-12-20 14:45
下一篇 2024-12-20 15:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信