跳到主要内容
PHP

PHP 7.4 新特性

管

管理员

https://segmentfault.com/a/1190000019554530

2022年09月05日 2,285 次阅读
本页目录

php 7新特性

PHP 7.4 新特性

PHP8新特性盘点


PHP 7.4 计划在2019年11月21日发布,它主要新增了以下几个特性:

  • 短闭包函数(short closure)
  • 预加载提交性能
  • 属性类型限定
  • Improved type variance(不会翻译)
  • 三元运算简写
  • 数组展开运算
  • 新增类的魔术方法:serialization
  • 数字分隔符
  • 运算优先顺序
  • 允许在__toString中抛出异常
  • 支持反射引用
  • 新增字节分割函数
  • 移除php短标签
  • 弃用左关联运算符
  • 不再向后兼容的变更

短闭包函数

短闭包函数可以减少冗余代码:

array_map(function (User $user) { 
    return $user->id; 
}, $users)
array_map(fn(User $user) => $user->id, $users)

需要注意几点:

  1. 短闭包可以直接访问闭包函数外面的变量,所以不需要再写 use 关键词
  2. 以fn关键词开始
  3. $this 可以像普通的闭包一样使用
  4. 短闭包只有一行代码,仅仅做返回声明使用,不允许使用return 关键词

还可以使用更严格类型的方式

$ids = array_map(fn(User $user): int => $user->id, $user);

预加载

PHP预加载可以极大的提高性能

优点:在PHP 7.4以前,如果你使用了框架来开发,每次请求文件就必须加载和重新编译。预加载在框架启动时在内存中加载文件,而且在后续请求中永久有效。

缺点:性能的提升会在其他方面花费很大的代价,每次预加载的文件发生改变时,框架需要重新启动。

属性类型限定

class A
{
    public string $name;
    
    public Foo $foo;
}

不得不说,PHP越来越接近Java等强类型语言

Improved type variance

协变返回类型:

class ParentType {}
class ChildType extends ParentType {}

class A
{
    public function covariantReturnTypes(): ParentType
    { /* … */ }
}

class B extends A
{
    public function covariantReturnTypes(): ChildType
    { /* … */ }
}

依赖(是不是很熟悉):

class ParentType {}
class ChildType extends ParentType {}

class A
{
    public function covariantReturnTypes(): ParentType
    { /* … */ }
}

class B extends A
{
    public function covariantReturnTypes(): ChildType
    { /* … */ }
}

简写三元运算符

在目前> PHP 7以后的写法:

$data['date'] = $data['date'] ?? new DateTime();

在PHP 7.4你可以这样写:

$data['date'] ??= new DateTime();

数组展开运算

合并数组到另一个数组中,返回一维数组

$arrayA = [1, 2, 3];

$arrayB = [4, 5];

$result = [0, ...$arrayA, ...$arrayB, 6 ,7];

// [0, 1, 2, 3, 4, 5, 6, 7]

注意 :只对数字索引有效

新增类的魔术方法

RFC添加了两个新的魔术方法__serialize和__unserialize

数字分隔符

允许使用下划线更直观的分隔数值

$unformattedNumber = 107925284.88;

$formattedNumber = 107_925_284.88;

运算优先顺序

PHP 7.4之前,如果你这样写:

echo "sum: " . $a + $b;

PHP会解析为:

echo ("sum: " . $a) + $b;

PHP 8将会解析为:

echo "sum :" . ($a + $b);

__toString中抛出异常

支持反射引用

PHP 7.4将会新增ReflectionReference 类

移除php短标签

<?将会在PHP 8中移除,<?=会继续保留

弃用左关联运算符

PHP遗留了一些奇怪的怪癖,比如

1 ? 2 : 3 ? 4 : 5;   // 将会在 PHP 7.4 中废弃,在 PHP 8中会抛出编译错误

(1 ? 2 : 3) ? 4 : 5; // 正确

不再向后兼容的变更

  1. 弃用在没有父类的情况下调用parent::
  2. 调用var_dump打印DateTime和DateTimeImmutableshi'实例,将不再保留对象上的可访问属性
  3. openssl_random_pseudo_bytes 会在调用错误时抛出异常
  4. 序列化PDO和PDOStatement 实例将会生成一个Exception而不是PDOException异常
  5. 调用get_object_vars()打印ArrayObject 实例将会返回ArrayObject 自己的属性,而不是被包裹的数组或对象的值,

数组强制转换不受影响

Related

相关文章

同分类文章 →
2026年07月11日 PHP

laravel什么样的方法适合放在模型中?什么适合用专门的服务类? cachedFavIds适合放在模型中吗?

一、适合放在模型中的方法Laravel 采用 ActiveRecord 风格,模型本身就是&quot;数据 + 围绕该数据的操作&quot;的载体。以下几类方法适合放模型: 关联关系:belongsTo、morphTo、hasMany 等。如 UserFav::userfavable()、UserFav::us

2026年04月13日 PHP

Vue3 静态文件放在同域名 Laravel 项目下

核心思路是:Vue3 构建后的静态文件放到 Laravel 的 public/ 目录下,通过 Laravel 路由的 catch-all 机制让 SPA 的前端路由正常工作。方案说明以 xx.com/admin 为例,整体架构如下:请求流程:xx.com/admin/* → Laravel

2025年08月18日 PHP

Laravel Eloquent 中可以通过静态方式调用的方法

在 Laravel Eloquent 中,可以通过静态方式调用的方法包括:1. 查询作用域 (Scopes)// 可以静态调用UserComment::active()-&gt;get();UserComment::where(&#039;status&#039;, 1)-&gt;first();2. Eloquent 内置的查询方法UserComment::fi

WeChat

扫码加我微信

微信二维码