在项目中使用PHP7新特性时PHPStorm出现了如下红色错误,
本地配置LNMP的PHP版本是7.2所以不是安装的PHP版本过低的问题,而是PHPStorm默认支持的PHP版本语法问题,通过在偏好设置中查看发现默认是PHP5.6
需要把这里的版本改为PHP7,但是可以看到却是不可编辑状态的,是因为phpstorm自动开启了composer配置文件同步的机制,只需要关闭就行,如下图
更改后应该如下图所示
接下来就可以更改PHP支持的语法版本了
选择好后,Apply并点击OK保存,红色波浪错误就消失了
php新特性:https://www.php.net/manual/zh/appendices.php https://wiki.php.net/rfc
php8.1 : https://www.php.net/releases/8.1/zh.php
php7.2相对于php7.1的新特性 http://php.net/manual/zh/migration72.new-features.php
php7.1相对于php7.0的新特性 http://php.net/manual/zh/migration71.new-features.php
从 PHP 5.6.x 移植到 PHP 7.0.x https://www.php.net/manual/zh/migration70.new-features.php
标量类型声明 sumOfInts(int ...$ints)
标量类型声明 有两种模式: 强制 (默认) 和 严格模式。 现在可以使用下列类型参数(无论用强制模式还是严格模式): 字符串(string), 整数 (int), 浮点数 (float), 以及布尔值 (bool)。 function sumOfInts(int ...$ints) { return array_sum($ints); } var_dump(sumOfInts(2, '3', 4.1));//int(9)
返回值类型声明 arraysSum(array ...$arrays): array
PHP 7 增加了对返回类型声明的支持。 类似于参数类型声明,返回类型声明指明了函数返回值的类型。 function arraysSum(array ...$arrays): array { return array_map(function(array $array): int { return array_sum($array); }, $arrays); } print_r(arraysSum([1,2,3], [4,5,6], [7,8,9]));//Array( [0]=>6, [1]=>15, [2]=>24 )
null合并运算符
由于日常使用中存在大量同时使用三元表达式和 isset()的情况, 我们添加了null合并运算符 (??) 这个语法糖。如果变量存在且值不为null, 它就会返回自身的值,否则返回它的第二个操作数。
$username = $_GET['user'] ?? 'nobody';
太空船操作符(组合比较符)
太空船操作符用于比较两个表达式。当$a小于、等于或大于$b时它分别返回-1、0或1。 比较的原则是沿用 PHP 的常规比较规则进行的。 // 整数 echo 1 <=> 1; // 0 echo 1 <=> 2; // -1 echo 2 <=> 1; // 1 // 浮点数 echo 1.5 <=> 1.5; // 0 echo 1.5 <=> 2.5; // -1 echo 2.5 <=> 1.5; // 1 // 字符串 echo "a" <=> "a"; // 0 echo "a" <=> "b"; // -1 echo "b" <=> "a"; // 1
define允许定义常量数组
Array 类型的常量现在可以通过 define() 来定义。在 PHP5.6 中仅能通过 const 定义。 define('ANIMALS', [ 'dog', 'cat', 'bird' ]); echo ANIMALS[1]; // 输出 "cat"
匿名类
现在支持通过new class 来实例化一个匿名类,这可以用来替代一些“用后即焚”的完整类定义。
Closure::call()
Closure::call() 现在有着更好的性能,简短干练的暂时绑定一个方法到对象上闭包并调用它。
use分组命名空间
从同一 namespace 导入的类、函数和常量现在可以通过单个 use 语句 一次性导入了。 // PHP 7 之前的代码 use some\namespace\ClassA; use some\namespace\ClassB; use some\namespace\ClassC as C; use function some\namespace\fn_a; use function some\namespace\fn_b; use function some\namespace\fn_c; use const some\namespace\ConstA; use const some\namespace\ConstB; use const some\namespace\ConstC; // PHP 7+ 及更高版本的代码 use some\namespace\{ClassA, ClassB, ClassC as C}; use function some\namespace\{fn_a, fn_b, fn_c}; use const some\namespace\{ConstA, ConstB, ConstC};
生成器可以返回表达式
只需在最外层生成其中使用 yield from, 就可以把一个生成器自动委派给其他的生成器
新增整数整除的函数 intdiv()
新加的函数 intdiv() 用来进行 整数的除法运算。
var_dump(intdiv(10, 3)); //int(3)
新增的随机函数
新加入两个跨平台的函数: random_bytes() 和 random_int() 用来产生高安全级别的随机字符串和随机整数。
http://php.net/manual/zh/function.random-bytes.php
http://php.net/manual/zh/function.random-int.php
从 PHP 5.5.x 移植到 PHP 5.6.x https://www.php.net/manual/zh/migration56.new-features.php
使用 ... 运算符定义变长参数函数
现在可以不依赖 func_get_args(), 使用 ... 运算符 来实现 变长参数函数。 function f($req, $opt = null, ...$params) { // $params 是一个包含了剩余参数的数组 printf('$req: %d; $opt: %d; number of params: %d'."\n", $req, $opt, count($params)); } f(1); //$req: 1; $opt: 0; number of params: 0 f(1, 2); //$req: 1; $opt: 2; number of params: 0 f(1, 2, 3); //$req: 1; $opt: 2; number of params: 1 f(1, 2, 3, 4); //$req: 1; $opt: 2; number of params: 2 f(1, 2, 3, 4, 5); //$req: 1; $opt: 2; number of params: 3
使用 ... 运算符进行参数展开
在调用函数的时候,使用 ... 运算符, 将 数组 和 可遍历 对象展开为函数参数。 在其他编程语言,比如 Ruby中,这被称为连接运算符,。 function add($a, $b, $c) { return $a + $b + $c; } $operators = [2, 3]; echo add(1, ...$operators); //6
php ?? 、?: 理解
在PHP 7中,双问号(??)运算符称为Null合并运算符。如果它存在且不为NULL,则返回其第一个操作数;否则返回第一个操作数。否则,返回其第二个操作数。
?: 三元操作符。从 PHP 5.3 开始,可以省略三元运算符中间部分。如果第一个操作数为空字符串,0,null,false等,则输出的是第二个操作数,否则返回第一个操作数;
三元运算符(?:) :$array["a"]?:"a" 等同于 $array["a"]?$array["a"]:"a" ,如果 不存在 $array["a"],会抛出异常。 NULL合并运行符(??) :$array["a"]??"a" 等同于 isset($array["a"])?$array["a"]:"a"。