首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

3.4 数据类型

数据类型是具有相同特性的一组数据的统称。常见的数据类型包括字符串型、整型、浮点型和布尔型。PHP早就提供了丰富的数据类型,PHP 5中又有更多补充。本节将介绍这些数据类型,可以分为3类:标量数据类型、复合数据类型和特殊数据类型。

3.4.1 标量数据类型

标量数据类型能包含单个的一项信息,以下都属于标量数据类型:布尔型、整型、浮点型和字符串型。

1. 布尔型

布尔数据类型以数学家乔治·布尔(1815—1864)的名字命名,他被认为是信息论的创始人之一。布尔变量表示真实性,只支持两个值:TRUE(真)或FALSE(假),不区分大小写。另一方面,也可以使用0来表示FALSE,非0值表示TRUE。下面是几个例子:

2. 整型

整数就是一个不包含小数部分的数。十进制数(基数为10)、八进制数(基数为8)和十六进制数(基数为16)都属于这一类。下面是几个例子:

所支持的最大整数与平台有关,一般是正负231。如果试图在PHP脚本中超出此限制,将自动转换为浮点数。示例如下:

这将得到下面的结果:

3. 浮点型

浮点数(floating-point number)也称为单精度数(float)、双精度数(double)或实数(real number),可以指定包含小数部分的数。浮点数用于表示货币值、重量、距离,以及用简单的整数无法满足要求的其他表示。PHP浮点数可以用多种方式指定,如下:

4. 字符串

简言之,字符串是一个字符序列,看作是一个连续的组。这样的组通常用单引号或双引号界定,不过PHP还支持另一种界定方法,这将在3.9节中介绍。所有三种界定方法都将在这一节中进行讨论。

下面是一些有效的字符串例子:

历史上,PHP将字符串看作数组(关于数组的更多信息,请参见下一节),允许通过数组偏移记法访问特定的字符。例如,如果有以下字符串:

可以将字符串当作数组来访问和显示某个字符,如下:

虽然这很方便,但会导致一些混淆,因此PHP 5引入了专门的字符串偏移功能,第9章将做详细介绍。此外,第9章还将重点介绍PHP中很多重要的字符串和正则表达式函数。

3.4.2 复合数据类型

复合数据类型允许将多个相同类型的项聚集起来,表示为一个实体。这包含数组(array)和对象(object)。

1. 数组

将一系列类似的项聚集在一起,并以某种特定的方式进行排列和引用,这通常很有用。这些数据结构称为数组(array),正式的定义是有索引的数据值集合。每个数组索引(也称为键(key))引用一个对应的值。索引可以是一个简单的数,指示某个值在系列中的位置;也可以与值有某种直接关联。例如,如果要创建美国各州的列表,可以使用数字索引的数组,如下:

如果项目要求将美国各州与其州府关联,该怎么做呢?这时就不用数字索引作为键,而是使用关联索引,如下:

第5章将对数组概念做正式的介绍,所以,即使现在还没有完全理解这些概念,也不要过于担心。只要记住,PHP语言的确支持数组数据类型。

注解   PHP还支持包含多维的数组,这称为多维数组(multidimensional array)。第5章将介绍有关概念。

2. 对象

PHP支持的另一种复合数据类型是对象。对象是面向对象程序设计范型的核心概念。如果你才刚刚接触面向对象程序设计,也不要担心,因为第6章和第7章将专门全面地介绍面向对象概念。

与PHP语言包含的其他数据类型不同,对象必须显式地进行声明。声明对象属性和行为在类(class)中进行。下面是类声明和相应对象实例化的一个普通的例子:

类定义创建了一些与数据结构相关的属性和函数,这里的数据结构名为appliance。根据以上声明,appliance不具备什么功能。它只有一个属性power。这个属性可以使用方法setPower()进行修改。

但是请记住,类定义是一个模板,本身无法进行操作,而是要基于此模板创建对象。这是通过new关键字实现的。因此,在上面代码的最后一行,创建了类appliance的一个对象,名为blender。

这样就可以使用方法setPower()来设置blender对象的power属性:

改进PHP的面向对象开发模型是PHP 5的重点。第6章和第7章主要介绍这个重要特性。

3.4.3 特殊数据类型

特殊数据类型包括那些提供某种特殊用途的类型,因此无法归入其他任何类别。这包含资源(resource)和空(null)数据类型。

1. 资源

PHP通常用于与一些外部数据源交互,如数据库、文件和网络流。通常,这种交互通过句柄(handle)完成,成功地连接资源时会对句柄命名。这些句柄将保持对资源的引用,直到通信结束,此时将撤销句柄。这些句柄就属于资源数据类型。

并非所有函数都返回资源;只是在PHP脚本中负责将资源绑定到变量的函数才会返回资源。这种函数包括fopen()、mysql_connect()和pdf_new()。例如,下例中,$link就是一个资源类型的变量:

资源类型的变量并不真正保存一个值;实际上只保存一个指针,指向所打开的资源连接。事实上,如果输出其内容,将看到一个资源ID号引用。

2. null

null(空)就表示“无”,这一直都是令程序员新手困惑的概念。null不表示空格,也不表示零;它表示没有值,“什么也没有”。PHP中,如果满足下列情况,则认为一个值为null:

  ● 没有设置为任何预定义的值。

  ● 明确地赋值为null。

  ● 使用函数unset()清除。

null数据类型只有一个值Null:

3.4.4 类型强制转换

将一个变量强制转换为与原类型不同的另一种类型,称为类型强制转换(type casting)。将变量强制转换为另一种类型,就能作为其他类型来计算。为此,可以在变量前面加上要转换的类型。在变量前插入表3-2所列的转换操作符就可以强制转换类型。

表3-2 类型转换操作符

转换操作符

转换为

(array)

数组

(bool) 或 (boolean)

布尔值

(int) 或 (integer)

整数

(object)

对象

(real) 或 (double) 或 (float)

浮点数

  (string)

字符串

考虑以下的例子。假设要将一个整数转换为双精度数:

虽然$variable1最初保存的是整数值13,但双精度转换可以临时将类型转换为双精度类型(即13变为13.0),然后将这个值赋给$variable2。

现在考虑相反的情况。将双精度类型转换为整数类型时,会有出人意料的影响:

双精度数的小数部分被截断。注意,无论小数值是多少,双精度数每次都会向下取整。

还可以将数据类型强制转换为数组的一个成员。所转换的值将成为数组的第一个成员:

注意,不能把这作为向数组中增加项的标准方式,因为这只适用于新创建数组的第一个成员。如果转换到一个已经存在的数组,原数组将被清空,只是在第1个位置上保留新转换的值。

如果将字符串数据类型转换为整型会发生什么呢?让我们看一下:

这没什么实际意义。反过来,将整数转换为字符串会怎么样?由于PHP的松散类型设计,这样就会返回整数值而不做任何修改。但是,在下一节将看到,PHP有时会根据特定情况主动转换为最合适的类型。

最后再举一个例子:任何数据类型都可以转换为对象。结果是,该变量成为了对象的一个属性,该属性名为scalar:

然后可以如下引用这个值:

3.4.5 类型自动转换

因为PHP对于类型的定义非常松散,所以有时会根据引用变量的环境,将变量自动转换为最适合的类型。考虑下面的代码:

结果不所出料:$total赋值为20,为此,已经将$count变量从字符串转换为整数类型。下面来看另一个例子:

因为最前面的$total字符串以整数值开头,所以计算中就使用了这个值。但是,如果它以数值的内容开头,则值为0。再考虑一个例子:

在这个例子中,为了计算if语句的值,字符串被转换为布尔类型。在PHP编程中,这确实是一个常用的做法,你不仅会经常看到,而且在优化代码时也很有用。

考虑最后一个特别有趣的例子。如果数学计算中用到包含.、e或E的字符串,这个字符串将作为浮点数进行计算:

3.4.6 与类型有关的函数

有些函数可以用于验证数据类型或者完成类型转换,这一节就要介绍这些函数。

1. settype()

settype()函数将var指定的变量转换为type指定的类型。type有7个可取值:array、boolean、float、integer、null、object和string。如果转换成功,则返回TRUE;否则,返回FALSE。

2. gettype()

getype()函数返回var所指定变量的类型。共有8个可能的值:array、boolean、float、integer、null、object、unknow和string。

3.4.7 类型标识符函数

可以用很多函数来确定变量的类型,包括is_array()、is_bool()、is_float()、is_integer()、is_null()、is_numeric()、is_object()、is_resource()、is_scalar()和is_string()。因为所有这些函数都有相同的命名约定、参数和返回值,所以下面将它们合并为一个一般形式来加以介绍。

is_name()

所有这些函数都可以归为一组,因为它们最终完成的是相同的任务。各函数都是确定var所指定的变量是否满足函数名所指定的特定条件。如果var属于该类型,就返回TRUE;否则就返回FALSE。下面是一个例子:

此代码返回如下内容:

注意,在结果为false的情况下,没有返回值。你可能会考虑为什么$item前面有一个反斜杠。由于美元符有一个特殊作用,一般用于标识变量,所以必须有一种方法告诉解释器,将这里的美元符视为要输出到屏幕的正常字符。在美元符前加上反斜杠就可以做到这一点。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论