第3章 类型
小学的时候,刚学会了算术,其中有一个同学就想卖弄一下,于是问另一个同学:“请问一头猪加一条狗等于多少?”,该同学动物课学得好,立即就回答说“猪和狗不是同一类,不能相加。你出的题目错了。”
从远古时期到现在,人类都把世界万物根据其特性进行归类,以方便记忆和管理。比如,花草树木是植物,猫狗是动物等,这样人类所看到的世界是一个有类型的世界。程序的世界里也一样,是一个有类型的世界。
3.1 类型的世界
不论哪一种程序语言,都是为人类解决问题的,要为人类解决问题就必须能描述人类世界中的类型,如果把整个世界看成是一个名叫“世界”的程序,那么“动物”、“植物”就是“世界”其中的两个类型。可以看出,程序和现实世界一样包含类型,刚开始学习编程的新手和刚来到这个世界的婴儿没有两样,人一出生就在学习这个世界,从认识猫狗花草,到给它们分类等,学习程序也是一开始就学习分类,只是程序就是程序,不可能完全照搬现实世界中的每一种类型,因此程序是一个“抽象”的概念,比如,用计算机描述“鸭子”,“鸭子”存在于计算机中仅仅是一个字符串而已,可以看到“鸭子”到了计算机里面就变成字符串了,再也不是现实中的鸭子了,但如果有人打开计算机,看到“鸭子”后,脑海里面立即就想到了现实中的鸭子,这就说明计算机里面的“鸭子”还是鸭子。还可以多保存几只“鸭子”,“李四家的鸭子”、“王五家的鸭子”等,保准李四看到“李四家的鸭子”后会想“这是在说我家的鸭子呢”。
3.2 一切皆数据
从上节可以得出一个结论:程序可以描述人类已知世界的所有东西,并以计算机程序的类型保存在计算机内,也可以说成人类把整个世界都装进了计算机,而整个世界在计算机里的表现形式就是数据。
学过计算机原理的人就知道,保存在计算机里面的数据最终是0和1,例如,李四的个人信息,姓名、性别、年龄、职业、住址、邮编、爱好、照片等,不论是汉字还是英文,是数字还是图片,最终保存到计算机都是0和1,由此可见,学习计算机编程首先需要改变看世界的观念,即这个世界里一切皆数据。管理这些数据的就是程序。
3.3 无类型(NULL)
现实世界中“没有”就是不存在,不存在就是没有,这类东西也就无法定性,没有类型。但在计算机里面可不行,现实世界里的所有东西都是以数据形式保存在计算机内,所以必须有一个类型来描述这种类型,PHP提供NULL类型来表达现实中的“无类型”。当一个变量(这里出现了一个陌生词语“变量”,先解释一下,变量是程序在管理数据时,为某一个数据取的名字,换句话说,变量也就是数据)是NULL值时,表示该变量没有值,非要说其有值,那也是“NULL”。
下面来完成一个无类型的演示。运行Zend Studio,按快捷键“Ctrl + Shift + O”或选择“Project”|“Open project”命令,选择项目“php”打开(如果没有php项目,请复习第2章相关内容),在项目中新建文件null.php,并输入代码3-1。
代码3-1 无类型null.php
<?php $var = NULL; $var1; $var2 = 'abcd'; unset($var2); var_dump($var, $var1, $var2); ?>
保存代码,按“F5”键运行,结果打印了3个NULL,表示变量在这3种情况下其类型都为“NULL”,如图3.1所示。
图3.1 无类型
代码分析:代码第3行定义变量$var,并赋值为NULL,第4行声明变量$var1,但没有赋值,第5行定义变量$var2,并赋值,第6行调用unset函数销毁了变量$var2,第7行用var_dump函数打印变量的相关信息,结果为3个都是NULL。
由此可见,在PHP中,有3种情况其变量的类型为NULL。
● 被赋值为NULL。
● 尚未赋值。
● 被unset()。
注意 NULL类型只有一个值,就是“NULL”,且大小写敏感。
3.4 布尔型(Boolean)
上节说的是“没有”,但没有不是真的没有,而是用关键字“NULL”表示“没有”。这节就是“有”了,布尔值也类似于计算机存储数据的方式,那就是0和1,其值表示为0或false(假),1或true(真),不区分大小写。布尔类型用在回答是或否时最合适,例如简历上的“是否已婚”、“是否离职”等。
下面是布尔型变量演示。运行Zend Studio,打开项目php,在其中新建文件boolean.php,并输入代码3-2。
代码3-2 布尔型boolean.php
<?php $var = true; $var1 = false; var_dump($var, $var1); ?>
保存代码,按“F5”键运行,结果如图3.2所示。
图3.2 布尔型
打印结果为变量$var的值为布尔型true,变量$var1的值为布尔型false。
注意 在PHP中,非零值转换为布尔型都为true(真)。
3.5 数值
数值类型又被分为整型和浮点型。整型就是不带小数位的数,浮点型则是带小数位的数。
3.5.1 整型(integer)
整型值可以用十进制、十六进制或八进制符号指定,前面可以加上可选的符号(-或者 +),如果用八进制符号,数字前必须加上0(零),用十六进制符号,数字前必须加上0x。如果不知道八进制或十六进制,请自己上网搜索相关资料。
下面是整型变量的演示。运行Zend Studio,打开php项目,新建文件“int.php”,并输入代码3-3。
代码3-3 整型int.php
<?php $var = 1234; // 十进制数 $var1 = -123; // 一个负数 $var2 = 0123; // 八进制数(等于十进制的 83) $var3 = 0x1A; // 十六进制数(等于十进制的 26) var_dump($var, $var1, $var2, $var3); ?>
保存代码,按“F5”键运行,结果显示如图3.3所示。
图3.3 整型
Debug Output区域显示的结果全部为int(整型)。
3.5.2 浮点型(float)
浮点型也叫双精度型或实型,用通俗的话来讲,就是带小数点的数字。
下面是浮点型变量的演示。运行Zend Studio,打开项目php,新建文件“float.php”,并输入代码3-4。
代码3-4 浮点型float.php
<?php $var = 1.234; $var1 = 1.2e3; $var2 = 7E-10; var_dump($var, $var1, $var2); ?>
保存代码,按“F5”键运行,结果如图3.4所示。
图3.4 浮点型
从运行结果中可以看到3个变量全部为float(浮点型)。
3.5.3 理解整型和浮点型
通过上面两节了解到,在PHP中数值类型被分为整型和浮点型,而在现实世界中却不这样分,比如说今年的方便面,以往都是2元一袋,现在涨价了,2.2元一袋了,这在现实世界中没什么关系,但在程序中就不行,如果不用浮点型,那么涨价的0.2元很可能因为整型的精度不够而丢掉,其结果还是2元。这时候可能有人疑惑,那直接用浮点型就可以了,为什么还要整型,这是因为计算机进行整型运算的计算速度远远大于浮点型运算,所以整型有存在的价值。
3.5.4 理解数值范围
小时候,几个小朋友在一起玩数数,第一个小朋友数到100,第二个就数到200。第一个继续数到1000,第二个就数到3000,第一个又继续数到10000,第二个马上就跟上数到20000。总之第二个小朋友就是要比第一个小朋友大。这种游戏不会分出胜负,只会让小朋友郁闷,为什么就不能有个最大数让自己说了以后,其他人就再无法比自己大了呢,这个梦想可能以前没有实现,现在好了,学编程可以让儿时的“梦想”在计算机的世界中实现。在计算机世界中,可以说一个数,别人就无法再比这个数大了,如果非要比这个数大,计算机会重新从0开始,甚至是负数。这是因为,在计算机里的资源都是有限的,任何一个量,都有一个大的上限,和小的下限,出了这个范围(比上限还大,比下限还小),就会溢出。下面看一个整数溢出的例子,运行Zend Studio,打开项目php,新建文件“int_overflow.php”,并输入代码3-5。
代码3-5 数值范围例子int_overflow.php
<?php $large_number = 2147483647; var_dump($large_number); $large_number = 2147483648; var_dump($large_number); // 同样也适用于十六进制表示的整数 var_dump( 0x80000000 ); $million = 1000000; $large_number = 50000 * $million; var_dump($large_number); ?>
保存代码,按“F5”键运行,结果如图3.5所示。
图3.5 整数溢出
代码分析:第3行定义变量$lrage_number并赋值为整数的最大值2147483647,第4行打印变量$large_number的类型为int(整型),其值为2147483647。第6行重新给变量$lrage_number赋值为2147483648,这个数大于整数的最大值2147483647,此时变量$large_number的类型变成了float(浮点型),而不是希望的整型。
由此可见,在PHP中如果给定的数超出了integer(整型)的范围,将会被解释为float(浮点型),同样如果执行的运算结果超出了integer(整型)范围,也会返回float(浮点型),这在实际编程应用中要特别小心。
3.6 字符串(string)
字符串就是一系列的字符,有3种方法定义。
● 单引号
● 双引号
● 定界符
当变量值仅仅是一个纯字符串时,使用单引号;当字符串需要包含变量时,使用双引号或定界符。下面是字符串变量演示。运行Zend Studio,打开项目php,新建文件“string.php”,并输入代码3-6。
代码3-6 字符型string.php
<?php $name = 'foolkaka'; $string = "My name is $name"; var_dump($string); $string = <<<EOD Example of string spanning multiple lines using heredoc syntax. EOD; var_dump($string); ?>
保存代码,按“F5”键运行,结果如图3.6所示。
图3.6 字符串
代码分析:第3行定义$name变量,并赋值“foolkaka”,其值使用单引号括起来,第4行定义变量$string,并赋值,其值用双引号括起来,并且还包括一个变量。第7行使用定界符括起变量$string的值。执行结果显示2个字符串变量的类型是string(字符串),值为赋予的值。
3.7 资源(resource)
资源是一种特殊变量,保存了到外部资源的一个引用。资源是通过专门的函数来建立和使用的。比如MySQL数据库,其资源的创建者是连接函数mysql_connect,当mysql_connect函数连接到一台MySQL数据库后,就创建了一个MySQL数据库连接句柄资源,直到mysql_close函数调用时,MySQL连接句柄资源被销毁。
3.8 小结
这一章首先让读者明白了计算机世界和现实世界一样,所有存在的东西都有类型的分类,只有了解类型,才能在下章中弄明白变量在什么情况下自动转换成什么类型,以及是否需要强制转换,否则,就会出现类似于猪和狗相加的问题,得到的结果往往会出错。
3.9 习题
一、填空题
1.PHP提供了__________和__________两种数值类型。
2.浮点型主要用于表示带有_______的数值。
二、选择题
1.字符串的定义形式包括( )。
A.单引号
B.定界符
C.双引号
D.大括号