2.1PHP语言的类型声明和类型转换

1.类型声明

类型声明可以用于函数的参数、返回值、类的属性,如果预期类型在调用时不匹配,则会抛出一个 TypeError 异常。

类型说明
bool值必须为一个布尔值。
int值必须为一个整型数字。
float值必须为一个浮点数字。
string值必须为一个 string。
array值必须为 array。
iterable值必须为 array 或 Traversable 接口的实例。
callable值必须是一个有效的 callable。 不能用于类属性的类型声明。
object值必须为 object。
Class/Interface值必须为给定类或接口的实例。
self值必须是用于类型声明的同一个类的实例。 只能在类的内部使用。
parent值必须是用于类型声明的类的父类的实例。只能在类的内部使用。
mixed值可以为任何类型。

2.问号?类型

类型声明前置一个问号 (?) 用来声明这个值允许为指定类型,或者为 null。

?类型

3.联合(Union)类型

联合类型接受多个不同的类型做为参数。

T1|T2|...

4.mixed类型

mixed类型为PHP支持的任意类型,等同于 :

//联合(union)类型  
object|resource|array|string|float|int|bool|null

5.交集(Intersection)类型

当一个值需要同时满足多个类型约束时,使用交集类型。

类型1 & 类型2

6.void返回类型

void 是一个返回类型,用于标识函数没有返回值。

void

7.Never返回类型

never 是一种表示没有返回的返回类型。使用 never 类型声明的函数或方法表示它不会返回值,并且会抛出异常或通过调用 die()、exit()、trigger_error() 或类似的东西来结束脚本的执行。

//PHP 8.1
function redirect(string $uri): never {
    header('Location: ' . $uri);
    exit();
}

function redirectToLoginPage(): never {
    redirect('/login');
    echo 'Hello'; // <- dead code detected by static analysis
}

8.严格(Strict)类型模式

可以按文件开启严格类型模式,在开启严格类型模式下,只能接受完全匹配的类型,否则会抛出 TypeError。 唯一的例外是 int 值也可以传入声明为 float 的类型。只有为标量类型的声明开启严格类型。

要开启严格模式,使用 declare 开启 strict_types

<?php
declare(strict_types=1);

function sum(int $a, int $b) {
    return $a + $b;
}

var_dump(sum(1, 2));
var_dump(sum(1.5, 2.5));
?>
//输出
int(3)

Fatal error: Uncaught TypeError: sum(): Argument #1 ($a) must be of type int, float given, called in - on line 9 and defined in -:4
Stack trace:
#0 -(9): sum(1.5, 2.5)
#1 {main}
  thrown in - on line 4

9.类型转换

PHP 中的类型强制转换和 C 中的非常像:在要转换的变量之前加上用括号括起来的目标类型。

<?php
// $foo is an integer
$foo = 10;
// $bar is a boolean
$bar = (boolean) $foo;
?>

允许的强制转换有:

  • (bool), (boolean) – 转换为布尔类型 bool
  • (int), (integer) – 转换为整型 int
  • (float), (double), (real) – 转换为浮点型 float
  • (string) – 转换为字符串 string
  • (array) – 转换为数组 array
  • (object) – 转换为对象 object

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/php/phplang/10495.html

(0)
上一篇 2021年1月18日 02:17
下一篇 2021年2月1日 22:30

相关推荐

发表评论

登录后才能评论