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

相关推荐

  • 3.4PHP语言的Trait

    Trait与接口的最大区别是:Trait包含了实现,而接口则需要指定一个实现该接口的类。 Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。所以,Trait内部可定义抽象方法,静态属性,静态方法,实例属性,实例方法。 个人见解:Trait功能是接口的升级版,类似于Ruby语言中的Module(…

    PHP语言教程 2021年3月4日
    07080
  • 3.5PHP语言的注解(Attribute)

    注解声明 注解声明总是以 #[ 开头,以 ] 结尾来包围,方括号内部则是一个或以逗号包含的多个注解。 注解的本质是类。 调用注解 注解的参数是非必须的。如果有参数,则以常见的括号()包围。注解的参数可以是字面值或者常量表达式。它同时接受位置参数和命名参数两种语法。

    PHP语言教程 2021年3月5日
    03570
  • 3.1PHP语言的命名空间(Namespace)

    什么是命名空间?从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。具体举个例子,文件 foo.txt 可以同时在目录 /home/greg 和 /hom…

    PHP语言教程 2021年3月1日
    05620

发表回复

登录后才能评论