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...
网友评论