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)0
进制描述
二进制以 0b(零和小写字母b) 开头。
八进制以 0(零) 或 0o (零和小写字母o) 或 0O(零和大写字母O) 开头。
十进制没有 0(零) 等前缀。
十六进制以 0x(零和小写字母x) 开头。

2.标量类型之浮点(float)类型

特殊浮点值:NAN(Not a Number)。

类型范围默认值
float浮点类型遵循IEEE 754二进制浮点算术标准0

3.标量类型之布尔(bool)类型

类型默认值
booltrue 或 false(两个值都不区分大小写)false

PHP语言允许 truefalse 为独立的字面量(Literal)类型。

类型
true只有一个值 true
false只有一个值 false

4.标量类型之字符串(string)类型

类型示例默认值
string‘string’、”string”空字符串(''""

如果一个字符串可以被解释为 intfloat 类型,则它被视为数字字符串。

类型示例
数字字符串“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)是一种特殊变量,保存了到外部资源的一个引用。资源是通过专门的函数来创建和使用的。

类型示例
resourceAddressInfo、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)类型模式

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

在开启严格类型模式下,只能接受完全匹配的类型,否则会抛出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

(0)
上一篇 2021年1月4日 17:20
下一篇 2021年1月5日 23:02

相关推荐

  • 1.3PHP语言的标识符(Identifier)

    1.标识符 标识符必须以字母(A~Z 和 a~z)或 下划线(_) 开头,后续可以是任何字母(A~Z 和 a~z)、数字(0~9)或 下划线(_)。标识符区分大小写,函数名称例外。 2.命名约定

    PHP语言教程 2021年1月3日
    05660
  • 1.9PHP语言的语句(Statement)

    1.declare语句 declare 结构通过设定指令(directive)以用来控制语句块(statement)的行为。 1.1ticks指令 目前,只支持 ticks、encoding、strict_types 这三个指令。 Tick 是一个在 declare 中的语句块(state…

    PHP语言教程 2021年1月9日
    0280
  • 2.11PHP类型之生成器(Generator)

    1.生成器类与自定义类 生成器(Generator)类是PHP语言内置的类,与自定义类一样都实现了 Iterator 接口,提供对象迭代的实现方式。 1.1优势:性能更好 一个简单的例子就是使用生成器函数来重新实现 range() 函数。标准的 range() 函数需要在内存中生成一个数组包含每一个在它范围内的值,然后…

    PHP语言教程 2021年2月11日
    0300

发表回复

登录后才能评论