文章教程

第3章类型

9/17/2020 9:34:15 PM 人评论 次浏览

第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 无类型

<?php 
 
$var = NULL; 
$var1; 
$var2 = 'abcd'; 
unset($var2); 
var_dump($var, $var1, $var2);
?>

保存代码,按“F5”键运行,结果打印了3个NULL,表示变量在这3种情况下其类型都为“NULL”,如图3.1所示。

015-01

图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 布尔型

<?php 
 
$var = true; 
$var1 = false; 
 
var_dump($var, $var1); 
?>

保存代码,按“F5”键运行,结果如图3.2所示。

015-01

图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 整型

<?php 
$var = 1234; // 十进制数 
$var1 = -123; // 一个负数 
$var2 = 0123; // 八进制数(等于十进制的 83) 
$var3 = 0x1A; // 十六进制数(等于十进制的 26) 
 
var_dump($var, $var1, $var2, $var3); 
?>

保存代码,按“F5”键运行,结果显示如图3.3所示。

015-01

图3.3 整型

Debug Output区域显示的结果全部为int(整型)。

3.5.2 浮点型(float)

浮点型也叫双精度型或实型,用通俗的话来讲,就是带小数点的数字。

下面是浮点型变量的演示。运行Zend Studio,打开项目php,新建文件“float.php”,并输入代码3-4。

代码3-4 浮点型

<?php 
 
$var = 1.234; 
$var1 = 1.2e3; 
$var2 = 7E-10; 
 
var_dump($var, $var1, $var2); 
?>

保存代码,按“F5”键运行,结果如图3.4所示。

015-01

图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 数值范围例子

<?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所示。

015-01

图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 字符型

<?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所示。

015-01

图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-1】在PHP中,保存各种数据类型需要使用变量,在PHP中对于变量类型的定义不是很严格,是因为程序可以根据上下文对变量的类型进行判断。第4章将介绍变量的知识,本实例先演示各种类型变量的定义方法、代码中定义变量,以及删除变量的方法。

  • 变量的名称由美元符号,后面跟变量名组成,合法的变量名以字母或下画线开始,后面跟着任何字母、数字或下画线。
  • 变量值是整型数字的,就是整型变量。
  • 变量值是小数的,就是浮点型变量。
  • 变量值是使用单引号、双引号或定界符括起来的,就是字符串型变量。
  • 变量值为TRUE或FALSE的,就是布尔型变量。
  • 数组变量的定义,是使用array()函数实现。
  • 特殊变量类型,如object、resource,都是函数返回的值,不能直接定义。
  • NULL类型的变量,代表变量没有值,其唯一可能的值就是NULL。
  • 删除变量,使用unset()函数。

代码3-7 各种类型变量的定义方法

<?php 
/*************************设置变量************************************/
$varint    = 1;                 //设置一个名为$varint的整型变量 
$varinteger = "4";               //设置一个名为$varinteger的字符串变量  
$varstring = "小李";              //设置一个名为$varstring的字符串变量 
$varbool   = true;               //设置一个名为$varbool的布尔型变量 
$varfloat  = 12.5;               //设置一个名为$varfloat的浮点型变量 
$vardelete = "delete";           //设置一个名为$varobject的字符串变量 
/** 
* 设置一个名为$varsarray的数组变量 
* */ 
$varsarray = array( 
    "1"=>"one", 
    "2"=>"two" 
); 
//为数组添加一个新元素 
$varsarray["3"] = "three"; 
/**
* 设置一个名为$vardarray的多维数组变量 
* */ 
$vardarray = array( 
    "cn"=>array("1"=>"一","2"=>"二"), 
    "en"=>array("1"=>"one","2"=>"two") 
); 
//定义一个类 
class testClass{ 
    var $_title = "这是对象类型的演示"; 
    function test(){ 
        echo $this->_title; 
    } 
} 
$newTest = new testClass();  //实例化类,取得对象类型变量 
$fp = fopen("test.txt","w"); //取得一个资源类型的变量 
$varnull = NULL;      //定义一个NULL类型的变量 
unset($vardelete);    //删除一个变量 
unset($varsarray["3"]);   //删除$varsarray数组中指定的元素 
 
?>

源程序解读:

(1)代码运行后,首先运行变量定义语句,并为定义的变量赋值。

(2)数组的定义,需要使用array()函数,而在定义二维数组或多维数组时,可以通过嵌套array()函数来实现。

(3)添加数组元素,可以使用“数组变量名[索引值]=′值′”的形式,如果索引值为空,系统将根据数组其他的索引值自动分配一个索引值。

(4)对象类型变量,可以通过初始化类来取得。

(5)资源类型变量保存的内容包括文件、数据库连接、图形画布区域等,因此这种类型的变量,只能通过函数返回取得,并且不能与其他类型进行转换。

(6)有3种情况,可以产生NULL值,即变量被赋值为NULL、变量没有被赋值、使用了unset()函数删除了变量。

(7)unset()函数用于删除已经定义的变量,被删除的变量,其值为NULL。unset()函数可以接收多个参数,即可以同时删除多个变量。

3.9 小结

这一章首先让读者明白了计算机世界和现实世界一样,所有存在的东西都有类型的分类,只有了解类型,才能在下章中弄明白变量在什么情况下自动转换成什么类型,以及是否需要强制转换,否则,就会出现类似于猪和狗相加的问题,得到的结果往往会出错。

3.10 习题

一、填空题

1. PHP提供了_____和_____两种数值类型。

2. 浮点型主要用于表示带有_____的数值。

二、选择题

1. 字符串的定义形式包括( )。

A. 单引号
B. 定界符
C. 双引号
D. 大括号

教程类别