当前位置:首页 > PHP学习宝典-第六章(续篇)

PHP学习宝典-第六章(续篇)

点击次数:1403  更新日期:2011-01-03
\n

第六章(续篇)


字串中的换行符号

虽然PHP为换行符号提供了一个跳脱转义序列(
),但让你知道能够在字串中间从字面上加入换行符号也不错,PHP同样能够处理这种形式。在建立HTML字串时这样会很方便,因为浏览器会忽略(
)换行符号,因此梢杂没恍蟹鸥袷交执沟肞HP程式码行更短:



在文字编辑器中,在前两行尾端隐藏按「Enter」键,这些换行符号保留在字串中,因此一条print叙述可以产生三行PHP输出(行的长度则取决于各种不同编辑器,如果编辑器在显示它们时自动换行,就会看到实际是一长条的三行程式码)。不过浏览器程式会忽略这些换行符号,并自己决定显示时是否换行以及在何处换行,此外如果使用你的浏览器的检视原始码观察原始码的话你会看到这些换行。

限制

对于字串长度没有什么人为的限制,只要在可用的记忆限度内即可,一般应该能不去限制字串长度

阵列

PHP的阵列型别使得程式设计者能够将许多不同型别的值组织在一起,并按照字(也可以按名称)对其进行索引。如果你发现自己在使用名字类似thing1、thing2、 thing3之类的变数,那就建议你应该采用阵列(things[1]、thing[2]、 thing[3]等)。阵列元素是透过方括号中的索引(在这个例子子中是)[1]、 [2]、 [3]等)来使用的,不同型别的元素可指定到同一个阵列中。

学习PHP阵列的最好方式就是透过范例。下面是一些简单的程式范例子,在第一次指定前和指定后查看阵列变数的内容:




让我们来说明第一次指定前和指定后发生的什么。在指定前,尽管有了名字,但PHP并不知道变数my_array的目的是要成为一个阵列,只把它当成与其它变数一样的未指定变数。这意思是说在该变数括到双引号字串时,变数被解释为空字串。阵列索引所参照引用([5])到未指定的变数时一样会作未指定变数。结果是前三条print叙述都以[is]为结尾。

指定之后,my_array正式成为一个阵列,而结果是在含到双引号字串时列印出「Array」字串。由数字5索引的阵列格已填入了字串「Slot#6」(实妹上,在大多数程式语言中,阵列元素是从0开始计数的)因此可用编号5的索引取字串。这是唯一发生变化的地方——my_array的第0格还是没有东西,所以和之前一样没有变化。

阵列的执行

阵列是PHP最酷且最有用的功能之一,虽然它们看上去好像类似其它语言中的阵列,但实际上是相当不贩方式来实行的。

在大多数程式设计语言中,会用类似下面的语句来宣告一个阵列:

Int int_array[10] ;//这不是PHP语法呼和哦!

该语句总共会记忆体中设置十个连续的整数,这些变数可按照int_array范围为0 ~9的编号索引来存取。

另一方面,PHP阵列是可以相互结合的,当进行阵列指定时,实际上添加一个新的囝列格,把它和一个新的索引组合在一起,这个索引可用来获取该值[对于熟悉准凑表(hash table)的程式设计来说这是很有意义的,PHP阵列更像其它语言中的准凑表]。

这里暗示了一件事,那就是读者不用担心指定一个数量非常高的阵列格,例如:

My_ayyay[100000000]= “not scary”//这个就没问题了

因为这样设的结果并不会真的出现很很多的格位,中间那些格位都不存在,因此也不会占用任何记忆体。

字串做为阵列索引

到目前为止,我们的阵列范例子只使用整数来索引编号,其实PHP也可以使用字串值做为索引,例如:

tasty[‘Spanish’]= “paella”;

tast [‘Japanese’]= “sashimi”;

tast [‘Scottish’]= “haggis?”;

这些索引与数字索引的使用方式相同,而且数字和字串索引可用于同一个阵列,它们不会有冲突。

结构型别怎么不见了?

有些程式语言(C、Pascal)提供了「结构(structure)」或「纪录(record)」型别,允许把不同型别的变数包装在一起。这样的语言中,选择复合型别的基本原则是:如果包含水量的所有值是同一型别的,否则就使用结构。

现在的PHP有了物件型别(object type),它除了有更特殊的属性外,也有类似纪录或结构型别的特性。然而在介绍物件之前,PHP也并不真正需要结构型别,因为PHP的阵列并没有限制只能使用一种型别的值。如果从有结构型别的语言中把程式码尊字典转到PHP中,有种可能性就是利用可结合的阵列,并使用字串索引,分别对应原来的栏位名称。

其它阵列特性

其实本章只会粗浅介绍阵列,另外,阵列还可以是多维的,可以用许多不同方法指定,并且还有许多有用的函式,可使用对阵列的观察、重用和操控更容易。在本书第十一章会更深入讲解阵列。

物件

PHP的另外一种基本型别就是物件,这是PHP进入物件导向程式语言的通道。有如阵列一般,物件也是一种复合型别,并可以使你将其他各种型别整合为一个物件,物件拥有额外更加复准的属性,包含水量可以将函式视为资料整合在内,并可以使用其他物件道向的观念,并期许你参阅该章节来学到更多的资讯。

Resources

Resources是PHP本身之外一种用来参照记忆体的特殊值,你不需要知道太多关于Resources就可以 写PHP,我们会简单介绍所有可能的Resources,但是请安心跳过以下「要如何处理资源」部分。

到底何者是Resources呢?

Resources是PHP用来与外部程式沟通的型别(可以是资料库或者影像处理程式),PHP可能需要使用这些程式在记忆体所配置的资源,大体上PHP程式设计师不需在PHP设计上担心记忆体的释放,如果你在PHP程式内产生一个字串(必须占据一部份记忆体位置),你可以忘记它的一切细节直到程式结束,PHP(或者所架的Wed伺服器)会在你的程式执行完毕后释回适当的记忆体,即使并非马上。

外部的程式(资料库等等)可能无法如此聪明的释放记忆体,等到你的程式已经运作之后你可能设想到为你的资料库保留适当的记忆体,PHP用这种方式所处理的方法是将所有有如这般外部程式存取记忆体的特殊函式都回传Resources,并用来让PHP检查是否你的程式可以取得这些资源,如果没有人可以使用这些资源的话,PHP会藉由记数此资源的参照,使得外部程式可以正确解决这类问题,如果参照计数为0的话这个资源就可以被释回了。

要如何处理资源?

通常PHP程式设计师本身并不需建立这些资源,他们藉由呼叫一些特殊函式来回传这些资源型别,并将之传迅给其他需要资源型别的函式。例如(我们会在本书第二部份介绍),你可以乎要mysql_connect()函式(用来回传连线到M y S Q L资料参照),并存放结果到一个变数,并传迅它给mysql_query()函式(使用此连线来存取资料库)。

基本上你使用这个连线资源所南需要的步骤是将它存放在一具变数并将它传迅至需要的函式内,你可以在程式结束后透过PHP来清除这个资源。无论如何,如果你觉得在程式结束之前这个资源在程式执行中已经耗尽了许多记忆体并想要提前释放的话,你应该可以如同这样做:

my_resource=mysql_connect();//存放变数

//使用连线资源的程式片段

my_resource=NULL;//变数不再参照原资源

my_resource的指定会使得PHP检查没有其他程式使用MySQL资源然后才开始释放它。

型别测试

因为变数能够根据重新指定来改变型别,有时就需要在程式执行时弄清楚某个值的型别。PHP既提供了一般的型别测试函式(gettype()),也为五种资料型别分别提供了Boolean函式。这些函式中有的还具有可替换的名称,表6-1总了这些函式:

表6-1函式的型别测试



指定和强制转换

正如前面已经讲过的,PHP常常在本文需要时自动把一种型别转换成另一种,不过PHP程式设计者也可以强制发生这样的转换。无论在哪种情况下,程试设计者都应该知道期望得到什么结果。

型别转换行为

以下是PHP从一种型别转换成另一种时的一些通则:

整数到倍精度浮点数:建立精确符合的倍精度浮点数(例如int4变成double4.0倍)。

倍精度浮点数到整数:小数部分被舍去。

数字到Boolean:如果等于0,则为FALSE,否则为TRUE。

数字到字串:字串按数字显示时的外观来建立。整数输出显示为一个数字序列,倍精度浮点数按所需的最小精度来输出,小数点后字数很多的倍精度浮点值将转换为笠学符号记数法。

Boolean到数字:如果是TRUE,则得到1,如果是FALSE,则得到0。

Boolean的字串:如果是TRUE,则得到1,如果是FALSE则得到空字串。

NULL到数字:0

NULL到Boolean:FALSE

字串到数字:等同于从字串「读取」一个数字,然后把它椟换成给定的型别。如果无法读出数字,则得值为0,并非所有字串都需要能够读取才算成功。

字串到Boolean:如果是空字串或0,则为FALSE,否则为TRUE。

简单型别(数字或字串)的阵列:等同于用指定给索引0的这个值建立一个新阵列。

阵列到数字:未定义(详见以下说明)

阵列到Boolean:如果阵列没有元素,则为FALSE,否则为TRUE。

阵列到字串:即为「Arryay」。

物件到数字:未定义(详见以下说明)。

物件到Boolean:如果物件含有任合成员变数拥有值的话为TRUE,否则为FALSE。

物件到字串:「Object」.

资源到Boolean:FALSE。

资源到数字:未定义(详见以下说明)

资源到数字:有时有如「Resource id #1」(但是无法十分依赖这个惯例)。

在上述列表中,我们发现有些型别在转换为数值型别时是未定义的,在上述说明中,未定义意指PHP设计者并没有在未业PHP版本定下何种最终的转换规则,所以坏消息就是必须根据你的程式写法所定,你可能在你使用的特定PHP版本发现可以转换为数值型别,但是却可能无法在下一个版本运作。

具体指定转换

PHP给程式设计者提供了三种不同的方式为操纵型别:转换函式、型别强制转换(与C语言中的一样)以及对变数呼叫(Settype()函式:

1. Intval()、doubleval()和strval()函式将把对应的参数分别转换成整数、倍精度浮点数或字串(没有boolval()函式)。

2. 任何运算式都可在前面加一个型别强制转换(型别名放在括号中),这样可把运算式结果椟换成想要的型

3. 任何变数都可以作为settype()函式的第一个参数,该函式将把此变数的型别转换成第二个函式参数所指定型别。

举例来说,下面的每种方法都会把正确的计数(101)放入整数



当然,范例的每种方法都采取间接的路线,其实无须转换成字串和倍精度型别,可立即转换成整数型别就足够了。

六种型别名称(integerdouble Booleanstringarray和object)中的每个在强制转换时都是有效的,并且可当成settpe()的有效参数。另外,在强制转换时还有一些可替换的名字是有效的(但在settype()中无数):(int)可替换(integer),(float)或(real)可替换(double),(bool)可替换(boolean)。要转换型别为resource是不合法的,而转换为NULL更是无意义的(因为其结果只能用NULL,所以你干 使用指定方法就好了)。

转换范例

范例6-1中的PHP程式码在HTML表格中显示了各种别转换,其结果如图6-1所示(这些程式码并不是当成式样范例之用的,它使用了几种还提及到的结构,只看目的地输出结果即可)。

范例6-1 型别转换






其它有用的型别转换

表6-2中列出的函式并不是绝对的转换型虽,但它们以有用的方式传回了与主要参数型别不同的值

表6-2其它类型的转换函式



函式ceil()带了一个浮点参数并传回大于或等于该数的整数值。例如:

my_double=4.7;

my_int=ceil(my_double);//my_int等于5

my_double=4.7;

my_int=floor(my_double)//my_int等于-4

Floor()函式与ceil()函式的功能正好相反(现在我们去掉了中间对 my_double的指定):

my_int=floor(4.7); //my_int等于4

my_int=floor(-4.7); //my_int 等于-5

Round()带了一个浮点参数并回最接近它的整数。如果浮点数的小数部分正好是一半,则取整到最接近的偶数。

my_int=round(4.7); //my_int等于5

my_int=round(-4.7); //my_int等于-5

my_int=round(-4.5); //my _int等于-4

如果你在寻找一个舍入函式(简单地去掉小数部分,用来取得整数位到0)请注意!其实这就是强制从double型别转换成int时的动作。

Chr()函式带一个整数参数,并传回ASCLL值为该数的单一字元字串,ord()函式与此正相反,传回字串中第一个字元的ASCI1值。

最后,implode()和以explode()允许在字串和阵列之间进行某种型别的转换。ImpIode()依据在第二个参数中带出的阵列建立一个字串,用第一个参数中带出的字串分隔阵列中的每个元素。例如:



浏览器产生下面的输出:

My short sentence.

Explode()与此过程正相反,根据字串建立一个阵列,例如:

words=explode(“”, “my short sentence .”);

整数溢位

最近,PHP中预设内建了一个相当聪明的自动转换规则,当整数值「溢出」时(即指定给它的值超出了它的可容纳的范围),则整数变成倍精度浮点数,这是有意的,因为倍精度浮点数比整数可容纳更大的数字,例如:



浏览器产生下面的输出:

Is 11100 still an integer?

Is 111000000 still an integer?

Is 111000000000 still an integer?

Is 1.11E+14 still an integer?

Is 1.11E+17 still an integer?

在这个例子中看到字面上的整数转学符号记数法中,这个转换反映了 too_big的类型由整数的精度浮点数的变化。当然,这可能会遗失一些资讯,因为以倍精度浮点数的精确度是有限的,但这样就和PHP的基本原则保持了一致,尽力做到最好,而不会产生错误。

补充:寻找最大的整数

如果你需要了解PHP所支援的最大整数,并且由于某些原因相信它不是一般的「231-1」可使用下面这个便利的函式(其中有使用还未讲到的概念):

Function maxint()

{/*较差的PHP函式整数大小——

采用「2^n -1」形式的最大整数值*/



摘要

PHP4有八种型别…Boolean 、NULL 、tring、 array 、object 和resource 。其中五种是简单型别:integer是整数,double是倍精度浮点数,Boolean是真或非真值,NULL只有一种可能值(NULL),string是字串(Boolean是PHP4新增的)。Array是个复合型别,它收纳了其它PHP的值,除了可按整数进行索引,也可接字串进行索引。Object是程式设计者定义类别的实例子,这些类别既包含成员变数,也可包含成员函式,并且可以其它类别继承函式及资料型别(我们会在第三十章说明)。最后 ,resource是外部程式记忆体配置用的特殊参照,PHP会在不再需要使用时自动释放它。

PHP中只是值是有型别的变数,变数不会有与生俱来继承的型别,其实它用的是最近被指定的值之型别。PHP自动根据使用值的文本转换值的型别。程式设计者也可以具体指定型别,可利用转换函式和型别强制转换来连成需要。


\n

出处:南方Linux

\n