PHPStorm使用PHP7新特性出现红色波浪错误

        在项目中使用PHP7新特性时PHPStorm出现了如下红色错误,

        冷暖自知一抹茶ck

        本地配置LNMP的PHP版本是7.2所以不是安装的PHP版本过低的问题,而是PHPStorm默认支持的PHP版本语法问题,通过在偏好设置中查看发现默认是PHP5.6

        冷暖自知一抹茶ck

        需要把这里的版本改为PHP7,但是可以看到却是不可编辑状态的,是因为phpstorm自动开启了composer配置文件同步的机制,只需要关闭就行,如下图

        冷暖自知一抹茶ck

        更改后应该如下图所示

        冷暖自知一抹茶ck

        接下来就可以更改PHP支持的语法版本了

        冷暖自知一抹茶ck

        选择好后,Apply并点击OK保存,红色波浪错误就消失了

        冷暖自知一抹茶ck





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"。


冷暖自知一抹茶ck
请先登录后发表评论
  • 最新评论
  • 总共0条评论