各位伙伴们,PHP 8.5 就要发布啦。
说实话,作为一名资深型开发者,它是让我兴奋地的版本之一。这些新功能虽然不多,但感觉很棒,你明白吗?我说的是那些能让我们每天生活更轻松的功能。
让我带你了解一下。
管道运算符,你可能在推文和 RFC 中见过它。没错,它确实很有用。
想象一下:你有一个名为 sendEmail 的函数
。它接受一个电子邮件地址作为参数,但在发送之前,你想对其进行一些清理。例如,删除空格、将其转换为小写……这些都是常见的操作。
在 PHP 8.5 之前,你会这样写:
$email = " TEST@EXAMPLE.COM " ;
$email = trim($email);
$email = strtolower($email);
sendEmail($email);
临时变量、重新赋值等等,这些都不是问题。而现在,有了管道运算符,可以这样来写:
“TEST@EXAMPLE.COM”
|>trim()
|> strtolower()
|> sendEmail();
不必使用临时变量,所有流程都是从左到右,这让你的代码更加地简洁。
接下来我要说的是,#[NoDiscard]
。
这个东东真是太棒了。有时你调用一个函数,必须使用返回值,但别人(甚至你自己)可能会忘记。
如果你忽略了它,PHP 8.5 现在可以发出警告了。
function getName():string{
return “Nuno”;
}
如果你这样做:
getName(); // PHP 会警告你:“嘿,你应该使用返回值!”
它会强制你处理结果,或者如果你真的想忽略它,可以显式地将其转换为 void。
说实话,这对我来说是三大特性中最重要的一个。将它与管道运算符结合使用,你就可以编写干净、安全的链式调用,而不会出现任何警告。
PHP 8.5 现在允许你在仅接受编译时值的地方使用静态闭包。类常量、默认属性值、属性参数……现在您可以在所有这些地方使用闭包。
classexample{
publicconstVALIDATOR = staticfunction ($value){
return!empty($value);
};
}
以前,这会失败,但现在可以了。你可以直接将可重用的逻辑附加到常量或属性上。这对于像 Laravel 这样使用大量验证或元数据的框架来说意义重大。
array_first()
和array_last()
我想知道,开发者获取数组的第一个或最后一个元素有多烦人吗?我的意思是说,PHP 提供有reset()
和end()函数
,但它们会移动内部指针。现在我们有这个新工具:
$user = [“阿德里安”,“玛丽亚”,“佩德罗”];
$first = array_first($users); // 阿德里安
$last = array_last($users); // 佩德罗
它简单、直观,最重要的是它不会干扰你的数组指针。正所谓小改动,大不同。
另一个微妙之处。PHP 8.5 现在允许你为全局常量添加属性,以前这是不可能的。现在,你可以执行以下操作:
"改用 NEW_CONSTANT" ) (
const OLD_CONSTANT = 42 ;
我们尝试显示它:
echo OLD_CONSTANT; // 42 + 弃用警告
它本质上是常量的元数据。如果你的框架或包使用常量进行配置,你现在可以清晰地附加额外的信息。
get_exception_handler()函数
。set_exception_handler()
,你就会知道检查现有的闭包很困难。
set_exception_handler(fn( $e ) => echo "捕获到:" . $e ->getMessage());
$handler = get_exception_handler();
var_dump( $handler );
这非常适合日志记录、调试,甚至在运行时修改异常处理。像 Laravel 这样的框架可以充分利用它来实现全局错误处理。
初始化列表格式化程序
这里有个有趣的例子:IntlListFormatter
。虽然不是每天都会用到,但需要的时候就很完美了。你可以列一个清单,然后根据本地规则进行格式化。
$formatter = new \Intl\IntlListFormatter('en', \Intl\IntlListFormatter::TYPE_AND);
echo $formatter->format(['Lisbon', 'Porto', 'Coimbra']); // "Lisbon, Porto, and Coimbra"
它会自动处理“and”、“or”以及其他本地化的列表格式化方式。这对于国际化应用来说,无疑是一个提升。
即使是 PHP 8.5 中的小改进也会产生影响,特别是使用 CLI 或关心内部调试或配置时。
php.ini的
差异(PHP-IN-DIFF
)在某些时候,你是否希望能够快速查看哪些设置已从默认 PHP 配置中更改?PHP 8.5使用新的 CLI 命令使此操作变得非常简单:
php- i --diff
这会向你显示哪些php.ini
选项与默认值不同。例如,我在测试时总是增加内存限制并禁用脚本超时:
memory_limit = - 1
max_execution_time = 0
以前,我们必须手动比较或滚动浏览phpinfo()
。
现在它实际上是内置的。对于任何调试 PHP 设置的人来说,这都是一个小小的改进,但却能带来巨大的帮助。
PHP 8.5 引入了一个新常量,它可以准确地告诉你二进制文件的构建时间。
想检查一下吗?
echo PHP_BUILD_DATE;
输出:
2025年9月18日 14:32:00
如果你运行多个 PHP 二进制文件,或者想要验证你正在使用的版本/构建,它就非常适合你。
虽然没有什么突破性的功能,但同样,它能提升你的使用体验。
PHP 8.5 改进了属性修饰功能,允许将单个属性标记为final
。之前可以将整个类设置为 final,现在可以在构造函数中指定特定属性:
class user {
public function __construct (
public string final $username,
public string $email ) {}
}
现在$username
无法在子类中被覆盖。这很微妙,但对于注重不变性的代码库来说,这是一个巨大的清晰度提升。
其他的小改进包括:
php -d
覆盖时更好的默认错误报告。上面这些都不需要你更改代码,但如果您是框架开发人员或 DevOps 人员,它们会使日常 PHP 使用更加顺畅。
重点是:PHP 8.5 不仅仅包含一些炫酷的功能。即使是细微的内部改进和 CLI 调整,也能减少工作流程中的摩擦。这才是它真正的魔力所在,减少您花在配置上的时间,将更多时间投入到编写真正有用的代码中。
PHP 8.5 包含许多提升用户体验的功能。并非所有功能都能改变你的世界,但它们共同作用,让这门语言更加流畅、安全、有趣。
PHP 8.5 感觉就像是那些让你再次乐于编写 PHP 的版本之一。它虽然并不华丽,但却巧妙、实用,并且以开发者为先。
如果你还没有体验过,那就赶紧测试一下 Beta 版吧。我保证其中一些功能会直接融入你的日常编程习惯里。
作者:行动的大雄
本篇文章为 @ 场长 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。