网站首页 > 精选文章 正文

hello呀,朋友们。许久不见了,因php8.4的发布,特回归我的头条来为php做做宣传。
其实有看到很多关于php的评论,其中最多的评价都在说PHP老了,无法媲美正火的几种编程怨言,坚持就要饿死。有个评论感概到:“廉颇老矣,尚能干?”。小编看后,也有些许思考。不过,我很快有了自己的看法:凭我之实力和经验,虽也有不同语言开发经历,但没法去定论php是否软了,也不能说坚持走这条路要饿死,存在即合理,每个人认知和接触领域不同,在我认知的领域却发挥着重大作用,身边很多人也靠它吃饭。所以,小编希望它越来越好。
回归正题,小编放了最新的排行榜,从11月的编程语言排行榜来看,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

属性钩子(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 的第一个元素的值。如果未找到匹配的元素,则函数返回 NULLnew 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(1732593243);
$dt->format('Y-m-d'); // 2024-11-26
 
$dt = DateTimeImmutable::createFromTimestamp(1732593243.432);
$dt->format('Y-m-d h:i:s.u'); // 2024-11-26 11:54:12.432000在早期版本的 PHP 中,有几种方法可以根据时间戳创建 DateTime 实例,例如 createFromFormat() 方法:
$dt = DateTimeImmutable::createFromFormat('U', (string) 1732593243);
//   date: 2024-11-26 11:54:12.0 +00:00,
// }
 
$dt = DateTimeImmutable::createFromFormat('U.u', (string) 1732593243.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
 
- 上一篇: 如何保证API接口安全?
 - 下一篇: SQL注入详解和SQL注入之超详细sqlmap使用攻略
 
猜你喜欢
- 2024-12-26 艾泽拉斯地图旅行指南!魔兽世界所有旅行和传送方式!
 - 2024-12-26 SQL注入详解和SQL注入之超详细sqlmap使用攻略
 - 2024-12-26 如何保证API接口安全?
 - 2024-12-26 SQLMAP注入参数-其他参数介绍
 - 2024-12-26 PHP 中最常用的 100 个函数
 - 2024-12-26 转-深度剖析 Swoole6 PHP 多线程实现原理
 - 2024-12-26 PHP与GO的区别
 - 2024-12-26 PHP8 - 纤程的使用
 - 2024-12-26 铜梁旅游电子全景地图上线啦 近百个景点一点即知
 - 2024-12-26 WEB漏洞SQL注入-SQLMap使用
 
- 最近发表
 
- 标签列表
 - 
- 向日葵无法连接服务器 (32)
 - git.exe (33)
 - vscode更新 (34)
 - dev c (33)
 - git ignore命令 (32)
 - gitlab提交代码步骤 (37)
 - java update (36)
 - vue debug (34)
 - vue blur (32)
 - vscode导入vue项目 (33)
 - vue chart (32)
 - vue cms (32)
 - 大雅数据库 (34)
 - 技术迭代 (37)
 - 同一局域网 (33)
 - github拒绝连接 (33)
 - vscode php插件 (32)
 - vue注释快捷键 (32)
 - linux ssr (33)
 - 微端服务器 (35)
 - 导航猫 (32)
 - 获取当前时间年月日 (33)
 - stp软件 (33)
 - http下载文件 (33)
 - linux bt下载 (33)
 
 
