我认为 8.4 是静态类型和其他函数的良好状态,它确实可以做比普通升级更多的事情。
在本文中,我们将探讨将 PHP 项目升级到 8.4 版本的主要理由。
就在前两天,php.net 瘫痪了 2 天!这就是为什么花了一段时间才发布这篇文章。
此项新增功能强调了 PHP 8.4 改进的重要性,特别是在静态类型和功能方面,使其有别于典型的次要版本升级。这有助于将本文框定为讨论更实质性的更新,为 PHP 开发提供有意义的增强功能。
1.增强的面向对象编程能力
PHP 8.4 引入了几个增强面向对象编程的功能:
属性挂钩
你现在可以向属性获取和设置操作添加自定义逻辑:
class Person {
public string $fullName {
get => $this->firstName . ' ' . $this->lastName;
}
public string $firstName {
set => ucfirst(strtolower($value));
}
}
这提供了对属性访问更细粒度的控制。
惰性对象
PHP 8.4 引入了创建具有延迟初始化的对象的功能:
$reflector = new ReflectionClass(Example::class);
$object = $reflector->newLazyGhost($initializer);
这对于提高依赖注入场景的性能特别有用。
2. 改善开发人员体验
#[\Deprecated] 属性
新的#[\Deprecated]属性提供了一种标准化的方法来将函数、方法和类常量标记为已弃用。如下例子:
\Deprecated(message: 'Use route /v2/something', since: 'v2')]
增强调试
WeakReference调试信息的改进Closure使得在调试期间更容易理解对象关系和闭包细节。
3. 新的语言特性
链接新表达式
现在,你可以直接在新表达式上调用链接方法,而无需使用括号:
$result = new MyClass->someMethod()->anotherMethod();
命名空间符号清除
退出命名空间现在会清除看到的符号,从而允许跨多个命名空间块更灵活地组织代码。
4. 性能改进
虽然迁移指南中没有提供具体的基准,但 PHP 8.4 可能包含各种性能优化,这是新 PHP 版本的典型特征。
5. 新函数与新类
与时俱进的,PHP8.4又为大伙增加了新的有用函数和新类/新方法。我们盘点如下:
http请求相关
request_parse_body():解析非 POST HTTP 请求中的 RFC1867(多部分)请求。
数学新函数
bcceil():将 BCMath 数字向上舍入为最接近的整数。
bcdivmod():同时对 BCMath 数字执行除法和模数运算。
bcfloor():将 BCMath 数字向下舍入为最接近的整数。
bcround():将 BCMath 数字四舍五入到指定的精度。
日期
DateTime::createFromTimestamp():根据 Unix 时间戳创建一个 DateTime 对象。
DateTime::getMicrosecond():检索 DateTime 对象的微秒部分。
DateTime::setMicrosecond():设置 DateTime 对象的微秒部分。
(与 DateTimeImmutable 的方法类似)
DOM
DOMNode::compareDocumentPosition():比较文档中两个节点的位置。
DOMXPath::registerPhpFunctionNS():注册一个 PHP 函数,以便在具有命名空间的 XPath 查询中使用。
DOMXPath::quote():引用字符串以用于 XPath 表达式。
哈希
HashContext::__debugInfo():为 HashContext 对象提供调试信息。
国际编程
IntlDateFormatter::getIanaID():获取格式化程序使用的时区的 IANA ID。
intltz_get_iana_id():获取给定时区的 IANA ID。
IntlDateFormatter::parseToCalendar():将字符串解析为日历对象。
SpoofChecker::setAllowedChars():设置允许进行欺骗检查的字符。
grapheme_str_split():将字符串拆分为字素簇数组。
新的字符串处理函数
如果你的项目中正在使用多字节字符串,可以尝试mb_trim(),mb_ltrim(),mb_rtrim(),trim() 函数的多字节版本。
还有mb_ucfirst(), mb_lcfirst(),ucfirst() 和 lcfirst() 的多字节感知版本。
操作缓存
opcache_jit_blacklist():将函数从 JIT 编译中列入黑名单。
pcntl系列函数
pcntl_getcpu():获取当前CPU。
pcntl_getcpuaffinity():获取进程的CPU亲和性掩码。
pcntl_getqos_class():获取进程的 QOS 类(仅限 macOS)。
pcntl_setns():设置进程的命名空间。
pcntl_waitid():等待子进程改变状态。
PGSQL 相关工具
Pdo\Pgsql::setNoticeCallback():设置处理 PostgreSQL 通知的回调。
数据库
各种新的 PostgreSQL 特定函数,用于高级操作。
反射
几种与延迟对象初始化和反射相关的新方法。
加密
AEGIS 加密算法的新功能。
频率响应
SplObjectStorage::seek():将迭代器移动到特定位置。
SOAP
SoapServer::__getLastResponse():获取来自 SOAP 服务器的最后一个响应。
HTTP 标准
http_get_last_response_headers():获取最后一个 HTTP 响应的标头。
http_clear_last_response_headers():清除存储的最后 HTTP 响应标头。
fpow():浮点幂函数。
array_all()与array_any()的数组实用函数。包括array_find(),array_find_key()等一序列函数。
Tidy文档
tidyNode::getNextSibling(),tidyNode::getPreviousSibling():在 Tidy 文档中的同级节点之间导航。
XMLReader 和 XMLWriter
创建和操作来自各种来源的 XML 的新方法。
XSL
XSLTProcessor::registerPhpFunctionNS():注册一个 PHP 函数以便在具有命名空间的 XSLT 中使用。
新的mb_*函数
如果你的项目中正在使用多字节字符串,mb_trim()将是一个受欢迎的补充。此包括mb_ltrim(),mb_rtrim(),mb_ucfirst(),mb_lcfirst()等一系列函数。
6.扩展库支持
PHP8.4 提供了改进的 cURL 扩展支持。用于处理 HTTP/3、调试和更详细的时间信息的新常量和相关选项。
增强型加密支持
OpenSSL 扩展现在支持基于 Curve25519 和 Curve448 的密钥,以及 Argon2 密码哈希(使用 OpenSSL 3.2)。
PDO 改进
特定于驱动程序的子类和 SQL 解析器,以提供更好的特定于数据库的功能支持。
7.标准化和现代化
PHP 8.4 延续了语言现代化的趋势,并使其与当前软件开发的最佳实践保持一致。
结语
升级到 PHP 8.4 有很多好处,包括增强的 OOP 功能、改进的开发人员工具、新的语言功能和扩展的库支持。虽然任何升级都应谨慎进行并进行适当的测试,但 PHP 8.4 中的新功能和改进,将使许多 PHP 项目进行引人注目的更新。
作者:军长
相关阅读: