• PHP 7.4 新特性


    PHP 7.4 主要新增了以下几个特性:

    • 短闭包函数(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打印DateTimeDateTimeImmutableshi'实例,将不再保留对象上的可访问属性
    3. openssl_random_pseudo_bytes 会在调用错误时抛出异常
    4. 序列化PDOPDOStatement 实例将会生成一个Exception而不是PDOException异常
    5. 调用get_object_vars()打印ArrayObject 实例将会返回ArrayObject 自己的属性,而不是被包裹的数组或对象的值,

    数组强制转换不受影响

    转载:https://segmentfault.com/a/1190000019554530

  • 相关阅读:
    cv2.imwrite()指定图片存储路径问题
    fgets读取文件最后一行重复问题
    KEAZ128 时钟配置
    MinGW x64 for Windows安装
    [python] pygame安装与配置
    S32K144之时钟配置
    C/C++ scanf和gets 区别 , printf和puts区别
    堆排序
    约瑟夫问题
    Coursera 国内无法登陆问题
  • 原文地址:https://www.cnblogs.com/haoyuekey/p/12794103.html
Copyright © 2020-2023  润新知