当前位置: 首页 > 文档资料 > PHP 语言规范 >

05 类型

优质
小牛编辑
130浏览
2023-12-01

概述

一个值的含义是由它的“类型”决定的。PHP 语言的类型可以分为“标量类型”和“复合类型”。 标量类型有Booleaninteger, floating point, stringnull。复合类型有arrayobjectresource是一种隐含类型,它的内部结构没有明确定义,并且依赖于具体的实现。

标量类型是“值的类型”。也就是说,一个标量类型的变量就是它的值本身。(是数据结构中最基本单元,只能储存一个数据。)

复合类型除了包含它本身的变量以外,还可以包含其他变量。比如,数组还包含属于它的元素,对象还包含它的属性。

对象和资源都是“句柄类型”。句柄类型中包含了指向一个值的“句柄”信息。在理解了给函数赋值、传递参数给函数、函数的返回值的语义之后,值和句柄类型之间的差别就会变得更加明显。

变量并没有被明确的定义成某一个类型,而且一个变量的类型是在运行时根据它本身包含的值决定的。 在运行时的不同时刻,同一个变量有可能是任意不同的类型。

PHP 的内置函数中提供了几个有用的检查和设置类型的方法,包括 gettypeis_typesettype,和var_dump

标量类型

概述

整型和浮点类型被统称为“算数类型”。库函数is_numeric用来判断一个值 是一个数字还是一个数字字符串

库函数is_scalar用来判断一个值是否是标量类型。该函数不认为NULL 是一个标量类型。可以用is_null来判断NULL

某些类支持运算和标量运算,或者转换为标量类型(目前只在内部类中实现)。这些类和标量类型一起 被称作“兼容标量类型”。需要注意的是,同一个类对于一个运算可能是标量兼容的,但是对其他的运算可能并不是。

布尔类型

布尔类型就是 boolbool就是boolean的一个代名词。此类型包含俩个不同的值,分别对应 truefalse。布尔类型的内部表示和它的值是不确定的。

库函数is_bool 可以判断一个值是否是布尔型

整数类型

有一个整数类型int,他是integer的代名词。该类型是二进制的,有符号的,且用二进制补码表示负值。 整型的数值的取值范围是可以在 PHP 实现中定义的,[-2147483648, 2147483647]的这个范围是一定能够被系统 支持的。而且这个范围必须是有界限的,不能是无穷的。

整型类型的值在某些操作后,产生的数学结果不能被表示为一个整型。包含以下情况:

  • 值增大后超过最大值,或者值减小后小于最小值。
  • 对最小值赋予负号。
  • 相乘、相加或相减俩个值。

在这些情况下,当计算完成,这些值的类型都被转换为float

常量PHP_INT_SIZEPHP_INT_MINPHP_INT_MAX确切的定义了int的属性。

库函数is_int用来判断一个值是否是int

浮点数类型

有一个浮点数类型float,它是doublereal的代名词。浮点数类型需要至少支持 IEEE 754 64位双精度的取值范围的表示。

库函数is_float 用来判断类型是否是float。 库函数is_finite 用来判断给定的值 是否是有限值。库函数is_infinite 用来判断是否是无限值。 is_nan 用来判断是否是合法数值。

字符串类型

一个字符串是一组零序列或多个字符的连续字节。

从概念上说,一个字符串可以被考虑成一个字节数组,这个数组的键值是从零开始的int值。 每个元素的类型都是string。然而一个字符串并不是一个集合,所以它不能被遍历。

一个长度为0的字符串是一个空字符串

至于一个字符串中的字节是如何转换成字符的是不确定的。

虽然字符串的用户可能会选择把特殊的语义归咎于字节中有\0的值,从PHP的角度看,"null bytes"没有 特殊的意义。PHP 并没有假设字符串中包含任何特殊数据,或者把特殊的值赋予任何字节和语句。然而,很多库函数 假设它们接收到的参数是UTF-8的编码,但是往往没有明确提到这一点。

一个数值字符串是符合下面str-numeric模式定义的字符串。一个数值前缀字符串是 起始的字符符合数值字符串需求,后面的字符不是数值的字符串。不是一个数值字符串的 字符串成为一个非数值字符串

  str-numeric::
    str-whitespaceopt   signopt   str-number

  str-whitespace::
    str-whitespaceopt   str-whitespace-char

  str-whitespace-char::
    new-line
    Space character (U+0020)
    Horizontal-tab character (U+0009)
    Vertical-tab character (U+000B)
    Form-feed character (U+000C)

  str-number::
    digit-sequence
    floating-literal

其他地方的定义

需要注意的是,数位序列被解释成10进制的数值(因此"0377"被视为有一个冗余前导零的 十进制数字377,而不是八进制的377)。

Only one mutation operation may be performed on a string, offset assignment, which involves the simple assignment operator =.

判断一个值是否是字符串的库函数式is_string

Null 类型

Null 类型只有一个可能的值,NULL。它表示它的类型和值都是没有定义的。

用库函数is_null 来判断一个值是否是NULL

复合类型

数组

数组是一个包含零个或多个元素的数据结构,它的值通过由类型是intstring的键值来访问。 更多细节,请移步 arrays chapter

判断是否是数组的函数是is_array

对象

对象的一个实例。每个不同的类声明都定义了一个新的类的类型, 每一个类的类型都是一个对象的类型。对象类型的表示是不确定的。

库函数is_object用来判断一个值是否是一个对象。get_class返回对象的类名称。

资源

资源 是外部资源的一个引用。 包括打开文件、数据库连接和网络套接字。

资源是一个表现不确定的抽象实体。资源只有在代码运行时被创建和销毁,而不是体现在PHP代码中。

每个不同的资源都有不同形式的唯一标识。

is_resource 函数判断一个变量是否是资源类型。函数[get_resource_type]能够返回一个资源的类型。

待完善内容

Callback 回调类型和伪类型