1.标量类型之整数(int)类型
如果给定的一个数值超出了 int
的范围,则将会被解释为 float
。同样如果执行的运算结果超出了 int
的范围,则也会返回 float
。
类型 | 是否精确 | 范围 |
int | 精确 | -9 223 372 036 854 775 808(-263) 到 9 223 372 036 854 775 807(263-1) |
整数类型的值的数字之间还可以包含下划线 (_
)。
$a = 1_234_567;
进制 | 描述 |
二进制 | 以 0b (零和小写字母b) 或 0B (零和大写字母B) 开头,后续只能包含数字 0 和 1。 |
八进制 | 以 0 (零) 或 0o (零和小写字母o) 或 0O (零和大写字母O) 开头,后续只能包含数字(0-7)。 |
十进制 | 没有 0 (零) 等前缀,后续只能包含数字(0-9)。 |
十六进制 | 以 0x (零和小写字母x) 或 0X (零和大写字母X) 开头,后续只能包含 数字(0-9) 和 字母(a~f 或 A~F)。字母(a~f 或 A~F) 表示 数字 10 到 15。 |
2.标量类型之浮点数(float)类型
浮点数类型遵循 IEEE 754二进制浮点算术标准。
类型 | 是否精确 | 范围 |
float | 不精确 | ±2.2250738585072E-308 到 ±1.7976931348623E+308 |
浮点数类型的值的数字之间还可以包含下划线 (_
)。
//示例
$a = 1.234;
$b = 1.2e3;
$c = 7E-10;
$d = 1_234.567;
另外还有一个浮点数值:非数值(NaN
,Not-a-Number)。
3.标量类型之布尔(bool)类型
类型 | 值 |
bool | 有两个值,就是不区分大小写的常量 true 或 false 。 |
以下类型中的一些值会被认为是“假”,除此之外的任何其它值(包括 true
)都被认为是”真“。
类型 | 这些值会被认为是“假” |
int | 0 |
float | 0.0 ,-0.0 。 |
bool | false |
string | 空字符串 "" ,数字字符串 "0" 。 |
null | null |
array | 空数组[] |
PHP 支持两种 字面量(literal) 类型:true
(自 PHP 8.2.0 起支持),false
(自 PHP 8.0.0 起支持)。
字面量类型 | 值 |
true | 只有一个值:true 。 |
false | 只有一个值:false 。 |
4.标量类型之字符串(string)类型
类型 | 描述 |
string | 具体见字符串相关章节。 |
如果一个 string
可以被解释为 int
或 float
类型,则它被视为数字(Numeric)字符串。
'88'
"888"
'8.8'
"88.8"
5.数组(array)类型
类型 | 描述 |
array | 具体见数组相关章节。 |
6.对象(object)类型
类型 | 描述 |
object | 具体见类相关章节。 |
7.类(class)类型
类型 | 描述 |
class | 具体见类相关章节。 |
8.接口(interface)类型
类型 | 描述 |
interface | 具体见接口相关章节。 |
9.枚举(enum)类型
类型 | 描述 |
enum | 具体见枚举相关章节。 |
10.可调用(callable)类型
类型 | 描述 |
callable | 具体见可调用类型相关章节。 |
11.资源(resource)类型
类型 | 描述 |
resource | 资源是一种特殊变量,保存了到外部资源的一个引用。 |
12.null类型
类型 | 值 |
null | 只有一个值,就是不区分大小写的常量 null 。 |
13.?T
类型
可以通过在类型前添加问号(?
)来表示值可以为 T
类型以外,还可以为 null
。
?T
//等同于以下联合类型
T|null
14.void返回类型
注意: 即使函数的返回类型是 void
,但仍然可以返回值,但值只能始终为 null
。
类型 | 描述 |
void | 表示函数不返回值,但该函数可能会终止。 |
15.never返回类型
类型 | 描述 |
never | 表示函数不返回值,且该函数不会终止,这意味着它要么调用 die() 、exit() 、trigger_error() 终止脚本的执行,要么抛出异常,要么无限循环。 |
16.交集(Intersection)类型
交集类型的值必须同时满足多个类(类或接口)类型,而不是一个类类型。
T&U&V
17.联合(Union)类型
联合类型的值只需要满足多个类型中的任意一个即可。
T|U|V
18.析取范式(Disjunctive Normal Form,DNF)类型
析取范式(Disjunctive Normal Form,DNF)类型允许我们组合 交集(Intersection)类型 和 联合(Union)类型,遵循一个严格规则:组合交集类型和联合类型时,交集类型外围必须使用圆括号进行分组。
T|(X&Y)
19.mixed类型别名
mixed
类型是 int|float|bool|string|array|object|resource|null
联合类型的别名。
20.iterable类型别名
iterable
类型是 array|Traversable
联合类型的别名。
21.类型默认值
未初始化的变量具有其类型的默认值,具体取决于使用它们的上下文。
但作为最佳实践,声明时对变量进行初始化是一个好习惯。
类型 | 默认值 |
int | 0 |
float | 0 |
bool | false |
string | 空字符串'' 或 "" |
array | 空数组[] |
22.类型声明
类型声明可用于 函数形参类型、函数的返回值类型、类静态属性、类实例属性。
23.类型转换
类型转换通过在需要转换的值的前面的括号中写入类型来将值转换为指定的类型。
$foo = 10; // $foo是int类型
$bar = (bool) $foo; // $bar是bool类型
类型转换 | 描述 |
(int) | 转换为 int 类型。 |
(float) | 转换为 float 类型。 |
(bool) | 转换为 bool 类型。 |
(string) | 转换为 string 类型。 |
(array) | 转换为 array 类型。 |
(object) | 转换为 object 类型。 |
24.严格(Strict)类型模式
默认情况下(未开启严格类型模式),如果可以转换的话,PHP 会强制转换不合适的类型为想要的标量类型。
严格类型模式 只能用于标量类型(int
、float
、bool
、string
)。
在严格类型模式下,不可以强制转换,只能接受完全匹配的类型,否则会抛出 TypeError。唯一的例外是 int
类型的值可以传入声明为 float
的类型。
要开启严格类型模式,可以在文件中使用 declare
语句开启 strict_types
。
注意:函数调用是否被应用严格类型模式,遵循函数调用所在文件是否开启严格类型模式,与声明函数的文件是否开启类型模式无关。
//函数参数
//开启严格类型模式
declare(strict_types=1);
function sum(int $a, int $b) {
return $a + $b;
}
var_dump(sum(1, 2)); // 输出:int(3)
var_dump(sum(1.5, 2.5)); // Fatal error
//未开启严格类型模式
function sum(int $a, int $b) {
return $a + $b;
}
var_dump(sum(1, 2)); // 输出:int(3)
var_dump(sum(1.5, 2.5)); // 输出:int(3)
//函数的返回值
//开启严格类型模式
declare(strict_types=1);
function sum($a, $b): int {
return $a + $b;
}
var_dump(sum(1, 2)); // 输出:int(3)
var_dump(sum(1, 2.5)); // 输出:Fatal error
//未开启严格类型模式
function sum($a, $b) {
return $a + $b;
}
var_dump(sum(1, 2)); // 输出:int(3)
var_dump(sum(1, 2.5)); // 输出:float(3.5)
25.协变(Covariance)与逆变(Contravariance)
协变(Covariance)允许子类方法的返回类型比父类方法的返回类型更具体。
逆变(Contravariance)允许子类方法的参数类型比父类方法的参数类型更不具体。
原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/php/phplang/28871.html