美文网首页
PHP7——及以上版本新特性简析

PHP7——及以上版本新特性简析

作者: 后厂村村长 | 来源:发表于2022-12-02 11:49 被阅读0次

PHP-8

指定参数类型(7以前就有)、可变参数个数、返回类型:

// ** 平方计算;
// ...$barr,不固定的可变参数个数;
// : array 强制返回数组类型
function new7feature(int $a, $b, ...$barr): array {
    $a = $a**2; //平方计算
    $b = $b??1; // 空结合操作符,null合并操作符
    $c = 1;
    if (($b<=>1) > 0)  // 太空船操作符
    {
        $c = 11;
    }
    return array(
        $a,$b,$c,array_sum($barr)
    );
}
print_r(new7feature(3,3,5,7));die;

参数类型约束

以前版本的PHP,函数和类方法不需要声明变量类型,任何数据都可以被传递和返回,这导致几乎大部分的调用操作都要判断返回的数据类型是否合格。
为了解决这个问题,PHP7引入了类型声明(其实7以前就有)。

目前有两类变量可以声明类型: 形参,返回值;
支持的类型有整形,浮点型,字符串型,布尔型;

strict_types:强制校验 参数OR返回值类型

strict_types 是 PHP 7 引入的一个新特性,通过 declare 设定,默认不开启,指令 declare (strict _ types =1); 表示开启,此时在调用函数时,会验证参数和返回值的类型和函数定义的类型是否完全一致,如果不一致将报错。
没有开启 strict_types 时,标量类型可能会限制内部隐式类型转化。 如果值的类型不是联合类型中的一部分,则目标类型会按以下顺序:

int
float
string
bool

如果类型出现在组合中,值可以按 PHP 现有的类型语义检测进行内部隐式强制转化,则会选择该类型。 否则会尝试下一个类型。

declare(strict_types = 1); // 此定义需在首行
//如果不做类型强制约束,PHP会将返回值转化为指定类型的数据再返回,如下示例,str会被转为int返回;
//如果指定了强制约束,PHP将不会进行类型转换,而是对比类型,若类型不同,则报 fatal error。
function bool2num(bool $a) : int
{ //形参的括号后面加冒号加类型即可指定方法返回值的类型,指定了什么类型返回的就是什么类型。
    return (int)$a;
}
var_dump(bool2num(true));

返回值类型,也可指定对象(比如 class),

此时,则必须返回指定对象的实例,如:

class Animal {
    private static $me=null;
    private $name='';
    private function __construct($name) {
        $this->name = $name;
    }
    public function getAnimalName() {
        return $this->name;
    }
    public static function getinstance(string $name) : Animal
    {
        if(self::$me != null) {
            return self::$me;
        }
        self::$me = new self($name);
        return self::$me;
    }
}
$tcase = Animal::getinstance('fox');
var_dump($tcase->getAnimalName());

如果不返回 Animal 类型,则会报fatal error。

允许兼容 null 类型

1、参数声明可同时兼容 null 类型

class C {}
function f(?C $c) {
    var_dump($c);
}
f(new C);
f(null);
//以上示例在参数传入 null 时不会报错,而是输出 `null`

2、返回值可同时兼容 null 类型

function get_item(): ?string {
    if (isset($_GET['item'])) {
        return $_GET['item'];
    } else {
        return null;
    }
}

注: 其实可通过设置参数默认值为 null 来变相实现允许为空的参数,但不建议如此做,会影响到类的继承调用。

class C { 
    public $show = 'c';
}
function f(C $c = null) {
    var_dump($c->show);
}
f(null);

如上示例,就会报notice,如果开启强制校验则会报fatal;

关于 PHP8 的一些新特性

联合类型 RFC
联合类型是两个或者多个类型的集合,表示可以使用其中任何一个类型。

public function foo(Foo|Bar $input): int|float;

请注意,联合类型中不包含 void,因为 void 表示的含义是 “根本没有返回值”。 另外,可以使用 |null 或者现有的 ? 表示法来表示包含 nullable 的联合体 :

public function foo(Foo|null $foo): void;
public function bar(?Bar $bar): void;

php官网链接参考:https://www.php.net/manual/zh/language.types.declarations.php
To Be Continued...

相关文章

网友评论

      本文标题:PHP7——及以上版本新特性简析

      本文链接:https://www.haomeiwen.com/subject/jxmcgltx.html