字串中的换行符号
虽然PHP为换行符号提供了一个跳脱转义序列(
),但让你知道能够在字串中间从字面上加入换行符号也不错,PHP同样能够处理这种形式。在建立HTML字串时这样会很方便,因为浏览器会忽略(
)换行符号,因此可以用换行符号格式化字串,使得PHP程式码行更短:
在文字编辑器中,在前两行尾端隐藏按「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版本发现可以转换为数值型别,但是却可能无法在下一个版本运作。
阅读(236) | 评论(0) | 转发(0) |