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 协议》,转载必须注明作者和本文链接
闲云野鹤
本帖由系统于 4年前 自动加精
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 13

感谢总结,一目了然!

4年前 评论
自由与温暖是遥不可及的梦想

感谢楼主,非常之喜欢

4年前 评论

语法越来越像ES6了

4年前 评论

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

4年前 评论

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

4年前 评论

集各大语言的优点吗?

4年前 评论

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

4年前 评论
kingThegirl 4年前

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

4年前 评论

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

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

滑稽[Doge]

4年前 评论

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

3年前 评论

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

file

3年前 评论
xianyunyehe (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!