PHP学习宝典-第五章

网络整理 - 07-27
第五章

语法、变量和输出

本章重点

◆ 了解PHP程序代码的基本法则

◆ 在变量中储存信息

◆ 在Web网页中显示输出

在本章中我们会讲解PHP的基本语法,就是所有正规格式用法的PHP程序代码都要遵循的规则。我们还会介绍在PHP程序代码执行如何使用变量储存和撷取信息,最后则谈到在使用者的浏览器窗口中显示文字的最简单方式。

PHP语法的宽松与弹性

关于PHP,首先要提到的就是它已努力做到尽可能的宽松与弹性了。根据要遵守的语法规则的严格程度,各程序语言之间的差别相当大。最好是有所选择,因为这样有助于确保编写的程序代码是真正你所需要的。如果在编写一个控制核子反应炉的程序,而且还忘记了指定一个变量,这样的话,让程序拒绝执行会比慢慢偏离原先的设计意图是要好得多了。然而PHP的基本设计原则是处在另一种规格样板上的,因为PHP本身是制作迅速而简单的Web网页工具,它重点在于让设计师在正确使用的前提下用起来很方便,而不是让程序做额外的多余工作来指明程序代码的含义。PHP需要的程序代码很少,但却能以最大努力表达程序代码的含义。这表示在其它语言中的某些语法的特性,诸如变量宣告和函式原型等,在PHP中是不需要的。

话说回来,PHP没法子读出你心中所想的,它还是必须由你来表达并且有一些些要遵循的语法规则。如果在浏览器窗口中看到了「parse error」,而不是原本打算制作出的Web网页成果,这意味着编写的程序代码在规则上已经犯到了PHP所不能容忍的程度。

HTML不是PHP

还有一个需要记住的重要内容是,该语法只应该用在PHP内。因为PHP是嵌入在HTML中的,在这样的档案中,每一部分都会分别由PHP或HTML解译,这要根据其中的PHP标记来区分。

PHP语法只在PHP内有效,因此我们假设在本章内容都是指在PHP模式中,也冰是说,大多数程序代码片段都假设被嵌入在HTML网页是,并且由适当的标记来区分标示。

PHP有C语言的语法风格

第三个要了解的重点是,PHP算是很像C语言风格的一种程序语言。如果读者已会C语言,那么你在学习PHP上就很快了:如果这样不行,再查阅一下手册。本章的其余部分是给另外一些还不了解C语言的人所写的,如果你是C语言程序设计师,那么可以快速翻一下这一章的标题就行了,另外也可以参考本书专门为C语言的程序设计师所准备的附录,这样可节省你宝贵的时间。

PHP对半型空白不敏感

半型空白是程序设计师键入的在屏幕上空出的部分,包括空格(spacehar)、Tab字符和Enter键(行末的结束符号)等等。PHP对这类空白并不敏感,但这并不意味空格和此类的内容没什么重要性(事实上,它们对于分隔PHP语言中的「单字或词」还是很重要的),不过在一行中有多少个空格符并无所谓,按一个空格符和很多这样的字符还是一样的。

例如,下面的把2+2的和指定给变量$four的每个PHP语法都是相等的

$four=2+2; //单一空格

$four =2+2 ;//空格与跳位键

$four =

2

+

2;//多行式

把Enter键的行结束符号做为空白是很方便使用的方式,因为这意味着不必确保语法一定位于单一行上,这样在编写程序上能方便很多。

PHP有时会区分大小写

前面已经讲到过PHP并不会过分吹毛求疵,读者可能感到惊讶它有时还是会区分大小写的(即区分英文字母大小写之间的差别)。这一点尤其是在所有变量设定上要注意。如果在HTML页中嵌入这样的程序代码:





<?php


$capital=67;


Print(“Variable capital is $capital<BR>”);


Print(“Variable CaPiTaL is $ CaPiTaL<BR>”);


?>


输出结果则是

Variable capital is 67

Variable CaPiTaL is

这是因为变量采用不同的大小写,因此就分成二个不同的变量。(令人讶异的是,在预设的除错设置下,类似这样的程序代码片段并不会产生PHP错误。请参见本章后面「未指定的变数」一节。)

另一方面,PHP与C语言不同的是,它的函式名称并不区分大小写,基本语法结构(if、then、else和while等)也是如此。

记述语句是以分号做为结尾

以下是PHP中的一个典型的语句,它把字符串指定给了$greeting变量:

$greeting=“Welcome to PHP!”;

这个小节的其余内容要介绍的是如何更小的组件来建构这样的语句,以及介绍PHP直译程序如何进行表示的求值运算(如果已很熟悉这些语句和表达式,可以跳过这些内容)。

PHP的最小构造算是不可分的标记(token),例如数字(3.14159)、字符串(〝tow〞)、变量($tow) 、常数(TRUE)和构成PHP本身语法的特殊单字(if、else等),它们相互之间的分隔靠的是空白和其它特殊字符(如图括号和大括号)。

PHP中最复杂的构造是表达式,表达式是具有[值]的标记之任何组合。单一个数字是表达式,单一个变数也是表达式。简单的表达式还可以组合起来构成更为复杂的表达式,通常是透过在表达式之间加上运算子(例如,2+(2+2)),或者把表达式当成函式呼叫的输入(例如,pow(2*3,3*2))。带两个输入的表达式数字当成输入,这样带输入的函式把输入放在函式名称后的括号中,各输入(称为参数)之间会以逗号分隔。

表达式求值运算

无论何时PHP直译器在程序代码中遇到表达式,这个表达式都全被立即进行评估求值。这意谓PHP从表达式最小元素的值开始计算,然后继续组合这些由运算子或函式连接在一起的值,直到生成表达式的整个值。举例说明,求什判断过程中的各步骤在想象中应该如下所示:

$result=2*2+3*3+5;

(=4+3*3+5)//想象的估算过程

(=4+9+5)

(=13+5)

(=18)

结果会在$result变量中储存了数字18。


优先级、结合性和评算求值的顺序

在PHP表达式评算求值中可能有两类问题:如果对子表达式进行组合或结合,评算求值的顺序是什么?例如,在刚显示过的评算求值过程中,乘法比加法的结合性更高更紧密些,这对最终结果是有影响的。

运算了结合表达式的特定方式称为优先级规则,高优先级的运算子会先取得其它周围的表达式来进行运算。如果需要,请记住这些规则,例如[*]总是比[+]的优先级高(后续各章中会详细讲解这些规则)。或者使用这条首要规则来判断:在不确定的时候,使用圆括号把表达式结合在一起。

例如:

$resultl=2+3*4+5//结果是19

$result2=(2+3)*(4+5)//结果是45

运算子优先级规则会拿掉关于表达式如何结合的模棱两可性,但当运算子具有同样的优先级时又会如何呢?以下机的表达式为例想一想:

$how_much=3.0/4.0/5.0;

这个表达式等于0.15还是等于3.75将取决于哪个除法运算子先处理数字4.0。在线上说明中有个详尽的结合性规则列表,但最要记住的规则就是结合性通常是从左到右的顺序,也就是说,上面的表示式评算求值的结果为0.15,因为两个除法运算子中靠左边的那个具有优先权。

最后的问题的评算求值的顺序,它和结合性并不同一回事。举例来说,下面的算术表达式:

3*4+5*6

我们知道乘法应该发生在加法之前,但这并不等于知道了PHP会先执和行哪个乘法运算。一般来说,使用者无须关心求值次序,因为绝大多数情况下这对结果没有什么影响。我们可以建造一些古怪的例子,让结果与求值次序有关,通常这是因为对表达式其它部分中进行了子表达式的指定。例如,

$hun=($this=$that+5)+($that+$this+3);//不良例子

但是请你不要这样写,好吗。PHP可能设有…依赖它,我们将不会告诉你它的结果(依赖由左向右求值次序的唯一合理应用是在Boolean表达式的「简短路径」方式中,我们将会在第七章进行讲解)。

表达式和型别

通常程序设计师会很小心地配合表达式的类型和将它们组合在一起的运算子或函式。常见的表达式是数学的表达式(用数学运算子结合数字)、Boolean表达式(用and或or结合true或false的语句)或字符串连算式(用运算子和函式来建构字符串)。与PHP的其余部分一样,对类型的处理会很宽松。例如,下面有表达式范例,很明显地它将两个运算试很不恰当地混合在一起使用了:





2 + 2 * 〝nonsense〞 + TRUE



这个表达式不会产生错误,而是求值为数字「3」(你可以暂时把这个范例当作猜谜,下一章将解释为什么会出现这样的结果)。

指定表达式

最常见的表达式类型是指(assignment),在表达式中,把一个变数设置为等于某表达式的评算求值结果。表达式的形式是,先有一个变量名(是以「$」开头),后面是一个等号,然后是要评算求值的表达式。例如,





$eight=2 * (2 * 2)


$eight」将按照所我们所希望的方式被指定。

有一件要记住的重要事项是,指定表达式也是一种表达式,因此它们本身是有「值」的!运算工指定的对象无论是变量或值都是相同的。这意谓着可以在更复杂的表达式中间使用表达式。如果对下面的表达式求值:





$ten=($two = 2)+($eight = (2 * 2))



每个变量都将被指定为等于其名称的数值。

总而言之,PHP中的叙述语句(statement)可以是最后带带着分号(;)的任何表达式。如果把表达式看成是词组,则叙述语句则算是「整个句子」了,分号就算是句子结尾处的句号。任何括在PHP标记内有效PHP叙述语句都算是PHP的有效程序代码。

使用表达式和语句的理由

通常只有两个理由需要在PHP中编写表达式:为了取得它的值(value),或者为了取得次作用(sideeffect)。表达式的值传递给包含它的更复杂表达式;而次作用是除求值结果以外发生的任何事情。最典型的次作用包括指定或更改变量,在使用者屏幕是显示某些内容,或者对程序环境的一些其它持久性改变(诸如与数据库的互动)。

仅管叙述语句是表达式,但它们本身不能包含在更复杂的表达式中,这意味着使用叙述语句的唯一理由就是它的「次作用」!这也意味着可以编者编写一些合法但完全无用的语句,例如下面的第二条语句:

Print(“Hello”);//副加效应为输出显示至屏幕

2 * 3 + 4;//无用,没有效应产生

$value_num= 3 * 4 + 5;//副加效应为指定

Store_in_database(49.5);//副加效应到数据库

大括号的使用

虽然叙述句不能像表达式那样合并,但可以在能够使用语句的位置放入一串语句,把它们括在大括号中即可。

例如,PHP中的if结构有个测试条件(在圆括号中),条件后面是如果判断结果为真则应该执行的语句。如果在判断为真时要执行多条语句,可以使用大括号括住的这一堆叙述语句。下面的二个if程序代码段是相等的(都是判断一个恒真的叙述并印出相同讯息):





if(3==2+1)


print(“Good – I haven′t totally lost my mind.<BR>”);


if(3 ==2+1)



Print(“Good – I haven′t totally ”);


Print(“lost my mind.<BR>”);


}



在大括号包围住的中央可放置任何语句,其中包括本身带有大括号区块的if叙述。这表示if语句可包含另一个if叙述,这种巢状嵌套可依需要套入任意层。

注释

注释是程序的一部分,就是我们人类用来解释说明程序而使用,目的是帮助说明解释程序代码。程序执行器对程序代码做的第一件事情就是剔除注释,因此注释对程序的功能没有任何作用。但它对于帮助其它人在阅读程序代码时,更能理解原设计者在编写程序时的想法,因此注释也可算是无价的,即使就是程序设计师自己编写了一段时间之后,再回头看自己的程序也是如此。

PHP算是从几种不同程序设计语言(包括C、Perl和UNIX的shell script)获取灵感。因而PHP支持所有这些语言的注释风格,并且这些风格可在PHP程序代码中自由混合使用。

属于C语言风格的多行注释

多行的注释风格和C中的相同:注释从字符对「/*」开始,以字符对「*/」当作结束。例如:





* This is


A comment in


PHP */




关于多行注释,要记住的最重要一点是,注释不能巢状嵌套方式编写。不能在一个注释内放另一个注释。如果试图这样做,注释将在第一个「*/」字符对后结束,原本要作为注释的其余部分将被解释为程序代码,可能会导致错误的结果。例如:





/* This comment will /* fail horribly on the


Last word of this */sentence


*/



这是一种很容易造成的无心错误,通常发生在试图「注释」一段已经有注释语言的程序时,是常遇到的,请读者小心。

单行注释:「#」和「//」

除了/*…*/这种多行注释之外,PHP还支持两种在给单行使用的不同注释方式,一种是从C和Java继承来的,另一种是则后Perl和shellscript继承来的。Shellscript风格的注释以「#」符号开始,而C++风格的注释以双斜线「//」开始。这两种方法都会将加注的该行叙述的剩余部分当成注释对待,如下所示的范例:





# This is a comment ,and


# this is the second line of the comment


//This is a comment too.Each style comments only


//one line so the last word of this sentence will fail horribly.



非常机灵的读者认为单行注释与我们前面所介绍到的空白不敏感性并不相容。这是对的,如果采用单行注释并用Enter行结束符号替换了其中一个空格,结果全是不同的。以更精确的讲法是,PHP在从程序代码中剔除了注释后,程序代码才是对空白不敏感的。

变数

在PHP程序中间储存信息的主要方式是透过使用「变量」,这是取一个名称然后保存发后要使用的任意值的方式。

关于PHP中的变量,以下有几点正是要注意知道(后面会有更详细的讲解):

◆ PHP中的所有变量都要在最前面加上「$」符号标示。

◆ 变数中的值是它最近被指定的值。

◆ 变量用「=」运算子进行指定,变量在左边,要评算求值的表达式在右边。

◆ 变量不需用要在指定之前进行宣告。

◆ 除了目前值的型别之外,变量没有固有的型别。

◆ 指定前就被使用的变量有其默认值。