前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP7.4新特性

PHP7.4新特性

作者头像
Petrochor
发布2022-06-07 15:44:23
5720
发布2022-06-07 15:44:23
举报
文章被收录于专栏:StephenStephen

最近,PHP官网刚刚发布了7.4版本,新增了类型声明,箭头函数,数值分割等新特性,以及弃用了一些方法,下面做一下简单的介绍及说明。

类型属性

在PHP7之后,对PHP弱类型有了些改进,使用注解的方法,对类属性进行声明,在最近发布的PHP7.4版本中,新增了类型属性。

以前的写法:

代码语言:javascript
复制
class User
{
    /**
     * @var int
     */
    public $id;

    /**
     * @var string
     */
    public $name;
}

7.4新特性,$user->id必须是int,name必须是string:

代码语言:javascript
复制
class User
{
    public int $id;

    public string $name;
}

箭头函数,短闭包

代码语言:javascript
复制
$factor = 10;
$nums = array_map(fn($n) => $n * $factor, [1, 2, 3, 4]);
// $nums = array(10, 20, 30, 40);

对比以前的写法,是不是要简单许多:

代码语言:javascript
复制
$factor = 10;
$nums = array_map(function ($num) use ($factor){
    return $num * $factor;
}, [1, 2, 3, 4]);

有限返回类型协变与参数类型逆变

仅当使用自动加载时,才提供完全协变/逆变支持。在单个文件中,只能使用非循环类型引用,因为所有类在被引用之前都必须可用

代码语言:javascript
复制
class A {}

class B extends A {}

class Producer {
    public function method(): A {}
}

class ChildProducer extends Producer {
    public function method(): B {}
}

打包内部数组

可能听到这个说法一脸懵逼,上一下代码就明白了:

代码语言:javascript
复制
$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];

原来就是数组组合起来

空合并分配运算符

代码语言:javascript
复制
$array['key'] ??= computeDefault();

等价于以前的方式:

代码语言:javascript
复制
if (!isset($array['key'])) {
    $array['key'] = computeDefault();
}

数值文字分隔符

数字文字可以在数字之间包含下划线

代码语言:javascript
复制
$val = 6.674_083e-11; // float
$val = 299_792_458;   // decimal
$val = 0xCAFE_F00D;   // hexadecimal
$val = 0b0101_1111;   // binary

允许从 __toString() 抛出异常

现在允许从 __toString() 引发异常,以往这会导致致命错误,字符串转换中现有的可恢复致命错误已转换为 Error 异常。

Opcache 预加载

新增 Opcache 预加载支持。

不推荐的语法

没有括号的三元运算,当然,不论在何种语言上,在没有括号的嵌套的三元运算符,都是不建议的
代码语言:javascript
复制
//不推荐
1 ? 2 : 3 ? 4 : 5;
//建议
(1 ? 2 : 3) ? 4 : 5;
1 ? 2 : (3 ? 4 : 5);
(real)和is_real()

(real) 替换为 (float)

is_real() 替换为 is_float()

allow_url_include

不推荐使用allow_url_include ini指令

array_key_exists

不建议在对象上使用 array_key_exists() 。 相反,应该使用 isset()property_exists()

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-12-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 类型属性
  • 箭头函数,短闭包
  • 有限返回类型协变与参数类型逆变
  • 打包内部数组
  • 空合并分配运算符
  • 数值文字分隔符
  • 允许从 __toString() 抛出异常
  • Opcache 预加载
  • 不推荐的语法
    • 没有括号的三元运算,当然,不论在何种语言上,在没有括号的嵌套的三元运算符,都是不建议的
      • (real)和is_real()
        • allow_url_include
          • array_key_exists
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档