1.5PHP语言的类型(Type)

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)都被认为是”真“。

类型这些值会被认为是“假”
int0
float0.0-0.0
boolfalse
string空字符串 "",数字字符串 "0"
nullnull
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.类型默认值

未初始化的变量具有其类型的默认值,具体取决于使用它们的上下文。

但作为最佳实践,声明时对变量进行初始化是一个好习惯。

类型默认值
int0
float0
boolfalse
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 会强制转换不合适的类型为想要的标量类型。

严格类型模式 只能用于标量类型(intfloatboolstring)。

在严格类型模式下,不可以强制转换,只能接受完全匹配的类型,否则会抛出 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

(0)
上一篇 2023年6月5日
下一篇 2023年6月6日

相关推荐

  • 1.7PHP语言的常量(Constant)

    1.常量声明 1.1define()函数声明方式 使用 define() 函数声明常量,值可以为任意表达式。 1.2const关键字声明方式 使用 const 关键字声明常量,值只可以为 标量类型(int, float, bool, string)表达式 或者 包含元素只为标量类型(int, flo…

    PHP语言教程 2023年6月7日
    0260
  • 2.10PHP语言的特性(Attribute)类

    1.特性(Attribute)类声明 声明一个特性类,首先从全局命名空间 use 导入 #[Attribute] 特性,然后在普通类声明上添加 #[Attribute] 特性以表示此类为特性类。 特性目标 描述 Attribute::TARGET_ALL 不限制用于具体哪一个。 Attribute::TARGET_CL…

    PHP语言教程 2023年7月10日
    0210
  • 2.3PHP类型之数组(Array)

    1.索引数组 2.关联数组 3.混合数组 键(key) 为可选项。如果未指定,PHP 将自动使用之前用过的所有的 int 键中最大的键加上 1 作为新的键。 4.多维数组 数组的元素还可以是其它数组,这称之为多维数组。 5.访问数组 6.数组长度

    PHP语言教程 2023年7月3日
    0260

发表回复

登录后才能评论