1.标量类型之整数(int)类型
如果给定的一个整数超出了 int
的范围,将会被解释为 float
。同样如果执行的运算结果超出了 int
范围,也会返回 float
。
类型 | 范围 | 默认值 |
int | -9,223,372,036,854,775,808(-263) 到 9,223,372,036,854,775,807(263-1) | 0 |
进制 | 描述 |
二进制 | 以 0b (零和小写字母b) 开头。 |
八进制 | 以 0 (零) 或 0o (零和小写字母o) 或 0O (零和大写字母O) 开头。 |
十进制 | 没有 0 (零) 等前缀。 |
十六进制 | 以 0x (零和小写字母x) 开头。 |
2.标量类型之浮点(float)类型
特殊浮点值:NAN
(Not a Number)。
类型 | 范围 | 默认值 |
float | 浮点类型遵循IEEE 754二进制浮点算术标准。 | 0 |
3.标量类型之布尔(bool)类型
类型 | 值 | 默认值 |
bool | true 或 false(两个值都不区分大小写) | false |
PHP语言允许 true
和 false
为独立的字面量(Literal)类型。
类型 | 值 |
true | 只有一个值 true |
false | 只有一个值 false |
4.标量类型之字符串(string)类型
类型 | 示例 | 默认值 |
string | ‘string’、”string” | 空字符串('' 或"" ) |
如果一个字符串可以被解释为 int
或 float
类型,则它被视为数字字符串。
类型 | 示例 |
数字字符串 | “888”、”8.8″ |
5.数组(array)类型
类型 | 示例 | 默认值 |
array | [7, 8, 0, 156, -10] | 空数组[] |
6.类(class)类型
类型 | 示例 |
class | 具体见类章节。 |
7.对象(object)类型
类型 | 示例 |
object | 具体见类章节。 |
8.接口(interface)类型
类型 | 示例 |
interface | 具体见接口章节。 |
10.枚举(enum)类型
类型 | 示例 |
enum | 具体见枚举章节。 |
10.可调用(callable)类型
类型 | 示例 |
callable | 具体见可调用类型章节。 |
11.可迭代(iterable)类型
可迭代(iterable
)类型的使用场景为 foreach
语句和生成器里的 yield from
。
类型 | 示例 |
iterable | 联合类型 array|Traversable 的别名 |
12.生成器(Generator)类型
类型 | 示例 |
Generator | 具体见生成器章节。 |
13.资源(resource)类型
资源(resource
)是一种特殊变量,保存了到外部资源的一个引用。资源是通过专门的函数来创建和使用的。
类型 | 示例 |
resource | AddressInfo、dba persistent、ftp、mysql link persistent |
14.空(null)类型
类型 | 值 |
null | 只有一个值 null(不区分大小写) |
15.?类型
类型前添加一个问号(?
)用来表示这个变量的值允许为指定类型的值或者为 null
。因此?T
和 T|null
是相同的。
?类型 a = 值;
16.联合(Union)类型
联合类型表示接受的值只需要满足多个不同类型中的一个就行,无需同时满足多个类型。
T1|T2|T3|...
如果其中一种类型是交集类型,需要使用括号括起来,在Disjunctive Normal Form(DNF,析取范式)中写成:T|(X&Y)
。
17.交集(Intersection)类型
交集类型表示接受的值必须同时满足多个类(类或接口)类型,而不是满足多个不同类型中的一个就行。
类型1 & 类型2 & 类型3
18.混合(mixed)类型
mixed
类型为以下联合类型的别名。
//联合(union)类型
object|resource|array|string|float|int|bool|null
19.void返回类型
void
是一个返回类型,表示函数没有返回值,但该函数仍可能终止。
void
20.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
}
21.严格(Strict)类型模式
严格类型模式只适用于标量类型(int
、float
、bool
、string
)。
在开启严格类型模式下,只能接受完全匹配的类型,否则会抛出TypeError。 唯一的例外是 int
值也可以传入声明为 float
的类型。
要开启严格类型模式,可以在文件顶层使用带有 strict_types
声明的 declare
语言结构。
严格类型模式只对启用严格类型模式的文件中进行的函数调用有效,而对该文件中的函数声明无效。
<?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
22.类型转换
类型转换通过在要转化的值前面的括号中写入类型来将值转换为指定的类型。
// $foo是整数类型
$foo = 10;
// $bar是布尔类型
$bar = (boolean) $foo;
类型转换 | 描述 |
(int) | 转换为整数类型int |
(float) | 转换为浮点类型float |
(bool) | 转换为布尔类型bool |
(string) | 转换为字符串类型string |
(array) | 转换为数组类型array |
(object) | 转换为对象类型object |
23.协变(Covariance)和逆变(Contravariance)
协变使子类的方法比父类的方法返回更具体的类型。
逆变使子类的方法比父类方法参数类型能接受更模糊的类型。
原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/php/phplang/10495.html