PHP7.4 新特性和废弃的功能

PHP7.4新特性

PHP7.4 2019年11月28日已经发布了。又带来了一些新特性。可以让我们的代码写的更少了。

1. 属性添加限定类型

<?php
class User {
  public int $age;
  public string $name
}  
$user = new User();
$user->age = 10;
$user->name = "张三";
//error
$user->age = "zhang";//需要传递int

2.箭头函数

这个特性基本上参考JsES6的语法。可以让我们的代码写的更少。如果你的代码有fn 这个函数。可能会冲突

<?php
$factor = 10;
$nums = array_map(fn($n)=>$n * $factor,[1,2,3]);//[10,20,30]
//之前的写法
$nums = array_map(function($num)use($factor){
  return $num * $factor;
},[1,2,3])

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

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

<?php
class A {}
class B extends A {}

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

4.数组解包

使用展开运算符...解包数组。这个特性,应该又是从js那吸收过来的。看例子

<?php
$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];//['banana', 'orange', 'apple', 'pear', 'watermelon'];
//老的写法
$fruits = array_merge(['banana', 'orange'],$parts,['watermelon']);

5. 空合并运算符赋值

<?php
$array['key'] ??= computeDefault();
// 老的写法
if (!isset($array['key'])) {
    $array['key'] = computeDefault();
}
?>

6. 数值文字分隔符

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

<?php
6.674_083e-11; // float
299_792_458;   // decimal
0xCAFE_F00D;   // hexadecimal
0b0101_1111;   // binary
?>

7. 允许从 __toString() 抛出异常

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

8. Filter

新增FILTER_VALIDATE_FLOAT

<?php
  filter_var(1.00,FILTER_VALIDATE_FLOAT);

9. strip_tags 支持数组

<?php
  strip_tags($str,['p','a','div']);
//老的写法
strip_tags($str,"<p><a><div>");

废弃的特性

1. 没有显式括号的嵌套三元运算符

<?php
1 ? 2 : 3 ? 4 : 5;   // deprecated
(1 ? 2 : 3) ? 4 : 5; // ok
1 ? 2 : (3 ? 4 : 5); // ok
?>

面试的时候,终于不用担心问你这个结果是啥了。其实生产中,大家也不会这么写。

2. 花括号访问数组索引

<?php
$arr = ["a"=>"111"];
$index = "a";
$arr{$index}//废弃
$arr[$index];

说实话,还是第一次见到,废弃了,说明大家不会这么用。

3. real 和 is_real 实数

<?php
  $num = "";
  $a = (real) $num;//废弃
$a = (float) $num;

4. parent关键词在没父类的类中使用

在没有父类的类中使用parent 会出现编译错误。

<?php
  class Test{
  public function index() 
  {
    return parent::index();//编译错误
  }
}

5. money_format函数

money_format被废弃,使用numberFormater替换

6. 移除的拓展

php
本作品采用《CC 协议》,转载必须注明作者和本文链接

闲云野鹤

本帖由系统于 8个月前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 13

感谢总结,一目了然!

8个月前 评论
自由与温暖是遥不可及的梦想

感谢楼主,非常之喜欢

8个月前 评论

语法越来越像ES6了

8个月前 评论

属性添加限定类型还不支持ArrayObject

8个月前 评论

写过一段时间的es6, es6语法写着确实爽

8个月前 评论

集各大语言的优点吗?

8个月前 评论

展开运算符... 好像7.0时候就支持了。

7个月前 评论
kingThegirl 6个月前

很像es6 有些写法确实很方便

7个月前 评论

箭头函数很好!可以抛弃啰嗦的 use($factor) 了

5个月前 评论
小李世界
<?php
$array['key'] ??= computeDefault();
// 老的写法
$array['key'] = $array['key'] ?? computeDefault();
// 更老的写法
if (!isset($array['key'])) {
    $array['key'] = computeDefault();
}
?>

滑稽[Doge]

5个月前 评论

有一个业务场景:查询一篇文章详情,但可能存在多个互不相干的维度来作为查询条件。如果每一个查询维度写一个方法的话,那方法名真的是不敢想象。未来的版本要是吸取一点swift的优势,支持存在重名函数就好了。具体使用的时候根据传参来区分,哇。。。想想都流口水 :joy:

2个月前 评论

说个题外话,建议大家以后编辑的时候注明具体的时间,例如:2020-06-23,不要写相对时间,比如:昨天,去年等等

file

1个月前 评论
xianyunyehe (楼主) 1个月前

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!