PHP 3 专题 -- 表达式

---摘自互联网

      表达式是PHP最重要的基石。在PHP中,您所写的几乎所有的内容都是表达式。最简单同时也是最精确的定义一个表达式的方法是“任何内容都有它的值”。 

  

        立刻进入大脑的简单例子是:常量和变量。当您输入“$a  =  5”,您就把值“5”赋给了变量“$a”,明显的,获得这个数值5,或者说’5’是一个值为5的表达式(在这个例子中,’5’是一个整数常量)。 

        赋值以后$a的值是5,  因此如果你这样写$b  =  $a,你它同$b  =  5所表达的意思是一样的.换句话说,$a是一个值为5的表达式.如果一切工作正常,这些将是所发生的一切. 

        再稍微复杂一点的表达式的例子是函数(function)  .例如,考虑以下下面的函数: 

  

function  foo  ()  { 

return  5; 



 

        假设你熟悉函数的概念(如果你不熟悉,看一下第四章),你可能假设$c=foo()从本质上说同$c=5是一致的,你是正确的.函数是以他们的返回值为值得表达式.既然foo()返回5,表达式’foo()’的值就是5。一般来说,函数不会仅仅返回一个态的值,他们一般都计算一些东西。 

        当然,PHP里面的值不必须是整数,并且经常他们不是PHP支持三种标量类型的数值:整数,浮点数,和字符串。(标量值是不能被再分为更小部分的数值,例如它不能是数组)。php也支持两种合成类型的数值:数组和对象。每一种数据类型都能被赋值给变量或者通过函数返回。 

        迄今为止,PHP/FI  2的用户不应该感觉到任何改变。然而,PHP把表达式带入了一个更深的层次,如同许多其它语言所作的一样。PHP是一种面向表达式的语言,几乎每一件事都是一个表达式.考虑一下我们已经处理过的表达式“$a=5”.可以非常容易的看出这里包含了两个值,常量’5’的值,和$a的值。$a的值也已经被更新成5。但是事实是这里还有一个额外的值包含其中,并且这个值就是赋值语句本身.这个赋值语句本身计算所赋值的数值,在这个例子中是5。实际上,它意味着“$a=5”,不管他做什么,是一个值为5的表达式。因此,一些像’$b=($a=5)’的表达式,实际上同’$a=5;$b=5’(分号代表表达式的结束)是一样的.既然赋值语句被以从右到左的顺序解析,你还可以这样写’$b=$a=5’。 

        另一个很好的表达式的例子是前和后递增量的方向性.PHP/FI  2的用户和许多其他语言的用户也许对符号(variable(变量)++和variable--)非常熟悉.这些就是递增和递减符号.在PHP/FI  2中,语句’$a++’没有任何值(不是一个表达式),并且因此你不能给它赋值或以任何方式来使用它.PHP通过发展这些表达式加强了递增(increment)/递减(decrement)的能力,像c语言中一样.在PHP中,有两种递增形式-前递增和后递增.这两种递增本质上都是使变量加1,并且对变量的影响都是一样的.他们的区别是递增表达式本身的值.前递增的形式是’++$variable(变量)’,计算递增值(PHP  在读出它的值之前递增变量的值,因此叫前递增)后递增的形式是’$variable++’,在变量递增前计算$variable的原始值(PHP先读出变量的值,然后再递增,因此叫后递增). 

        表达式的最后一个例子我们将处理组合操作符赋值表达式.你已经知道了如果你想将变量$a的值加1,你可以简单的写成’$a++’或’++$a’.但是如果你想加的数值不只是1呢,例如3?你可以多次使用’$a++’,但是很明显这样不是一个有效的,简洁的方式.通常的方法是这样写’$a=$a+3’.  ’$a=$a+3’计算变量$a加3后的值,并且被重新赋值给了变量$a,最终的结果是变量$a的值加了3.在PHP中,如同像C一样的其它一些语言,你可以用更简短的方式来做这些.给变量$a的当前值加3可以写’$a+=3’.这个表达式正确的意思是”读出$a的值,加3,然后把它赋值给$a”.除了更加简洁和简略外,这样的语句执行起来速度更快.表达式’$a+=3’的值,像一个正则赋值语句的值.是被赋予的值.注意它不是3,而是$a+3的组合的值(这是一个被赋给$a的值).任何二元操作符都可以被用来组合成复合赋值操作符.例如,’$a-=5’($a=$a-5),’$b*=7’($b乘以7),等等. 

        如果你没有在其它语言中加过的话,你会认为下面的表达式看起来非常奇怪.这就是三元条件算子: 

        $first  ?  $second  :  $third 

        如果第一个子表达式的值为真的话(非0),那么他的第二个子表达式将被计算,并且这就是整个条件表达式的值.否则,第三个子表达式将被预算,结果作为整个条件表达式的值. 

        下面的例子可以帮助你大体上理解前,后递增和表达式. 

function  double($i)  {  return  $i*2;} 

$b  =  $a  =  5;  /*  把5赋值$a和$b  */ 

$c  =  $a++;  /*  后递增,  把$a的原始值(5)赋值给$c  */ 

$e  =  $d  =  ++$b;  /*  前递增,  把经过递增操作的$b的值(6)赋值给$e和$d  */ 

/*  这时,$d和$e都等于(6)  */ 

$f  =  double($d++);  /*  把$d的原始值(6)加倍,然后赋值给$f.$f等于(12)*/ 

$g  =  double(++$e);  /*  先把$e执行递增操作,然后加倍,  2*7  =  14赋值给$g*/ 

$h  =  $g  +=  10;  /*  首先,$g加10,并且最终结果是24.将这个值赋值给$h,并且$h最终的结果也是24.*/

        在本章的一开始,我们就说过”我们将描述各种类型的语句”.表达式可以成为语句,然而,并不是每一个表达式都是一个语句.既然这样,一个语句具有’expr’’;’的形式,一个表达式加上一个分号.在’$b=$a=5;’中,$a=5是一个有效的表达式,但是他不能由他自己构成一个语句.但是’$b=$a=5;’却是一个有效的语句. 

        最后一个值得提起的事情是一个表达式的值的真假.在很多事件中,主要在条件执行和循环中,你对表达式的确切的值并不感兴趣,你仅仅对他是否以为着  TRUE(真)或FALSE(假)(PHP没有专门的boolean类型).在PHP中计算表达式的真假的方式同perl非常相似.任何非零的数值都是TRUE,零是FALSE!注意负数也非零,所以也为真!空字符串和字符’0’为FALSE;所有其他字符串为TRUE.对于非标量的数值(数组或对象)-如果值没有包含任何元素,则被认为为FALSE,否则为TRUE. 

        PHP提供了一个完整而且强大的表达式工具,并且完全说明他已经超出了本手册的范围.关于表达式是什么,你怎么才能构造一个有效的表达市,上面的例子应该给了你一个很好的提示.贯穿这个手册的其余部分,我们将用’expr’代表有效的PHP表达式. 

  

IF 
        IF结构是任何语言中最重要的特性之一,PHP也包括了它。它允许进行条件判断同时执行相应的程序段。PHP中IF语句的特性和C是十分类似的: 

if  (expr) 

statement

        在对该表达式片段的描述后,会判断表达式的值是否为真。如果表达式的值为真,PHP会执行该语句,如果该值为假,那么PHP将会跳过该语句。 

  

        接下来的例子中如果$a比$b大,那么将显示“a  is  bigger  than  b”。 

if  ($a  >  $b) 

print  "a  is  bigger  than  b"; 

 

        通常的情况,是用户希望使用不只一条语句被有条件的执行。当然,在这里没有必要对每一个语句使用IF条件判断。用户可以使用一组语句来实现这个功能。例如,如果$a比$b大,那么下面的代码将显示“a  is  bigger  than  b”,同时将$a的值赋给$b。 

if  ($a  >  $b)  { 

print  "a  is  bigger  than  b"; 

$b  =  $a; 



 

        IF语句可以嵌套在另一个IF语句之中,利用这一点,用户可以根据不同的情况执行程序中不同的部分。 

  

ELSE 
        通常,可能在条件符合时希望运行某个语句,而在条件不符合时希望运行另一段程序。这就是ELSE语句的作用。ELSE扩展了IF语句的作用,当条件为假时,ELSE后面的语句将被执行。例如,接下来的程序段将在$a大于$b的时候显示“a  is  bigger  than  b”,在其他的情况下显示“a  is  NOT  bigger  than  b”。 

if  ($a  >  $b)  { 

print  "a  is  bigger  than  b"; 

}  else  { 

print  "a  is  NOT  bigger  than  b"; 



 

        ELSE语句并不仅仅起到在IF表达式值为假的时候执行语句的作用,如果在它后面接上IF的话,就成为了ELSEIF语句,使用它可以进一步的分析假的情况(见下文)。 

  

ELSEIF 
  

        正如它的名字所暗示的,ELSEIF是IF和ELSE的组合。和ELSE一样它扩展了IF语句对FALSE(假)的处理。但是和ELSE不一样的是,ELSEIF将已经为假的条件再进行一次判断,并根据判断的结果进行处理。例如,下列代码在$a>$b的情况下将显示“a  is  bigger  than  b”,当$a不大于$b的时候就再进行一次判断,如果$a==$b,将显示“a  is  equal  to  b”,如果$a<$b将显示“a  is  smaller  than  b”。 

if  ($a  >  $b)  { 

print  "a  is  bigger  than  b"; 

}  elseif  ($a  ==  $b)  { 

print  "a  is  equal  to  b"; 

}  else  { 

print  "a  is  smaller  than  b"; 



 

        在同一个IF语句中可以有多个ELSEIF语句。第一个ELSEIF表达式(if  any)如果为真,那么将被执行。在PHP3中,您也可以写成“else  if”(使用两个词)同时效果和使用“elseif”(一个词)是一样的。他们的语言仅仅有些微的不一样(如果您熟悉C语言的话,您会发现这个不一样和在C中类似)但是最终他们的结果是完全一样的。 

  

        ELSEIF语句仅仅在IF语句或前一个ELSEIF的表达式为假,同时当前的ELSEIF语句表达式为真的情况下执行。 

  

IF语句的交互语法:IF()..  ..ENDIF 
        PHP3提供了一种不同的方法在IF语句中建立语句组。这种方式在您将HTML嵌套进IF语句中非常常见,但是您可以将着种方法应用到任何位置。除了使用{}之外,IF表达式可以跟随一个冒号,一个或多个语句,然后使用ENDIF结尾;请注意如下的例子: 

  

<?php  if  ($a==5):  ?> 

A  =  5 

<?php  endif;  ?> 

 

        在上面所示的例子中,利用交互语法,HTML语句“A  =  5”被嵌套进了IF语句之中。这个HTML语句会在$a为5的时候被显示。 

        这种交互语法也可以应用在ELSE和ELSEIF语句之中。接下来的例子是使用交互格式的IF、ELSEIF和ELSE语句。 

if  ($a  ==  5): 

print  "a  equals  5"; 

print  "..."; 

elseif  ($a  ==  6): 

print  "a  equals  6"; 

print  "!!!"; 

else: 

print  "a  is  neither  5  nor  6"; 

endif; 

 

WHILE 
        WHILE循环是PHP3中循环的一个简单例子。它和在C中的表现完全一样,WHILE语句基本的结构如下所示: 

        WHILE(expr)  statement 

  

        WHILE语句的的含义是十分简单的。它告诉PHP在WHILE表达式为真的情况下反复的执行嵌套的语句。表达式的值在每一次循环开始的时候被检查,所以即使这个值在执行嵌套的语句时被更改了,执行过程将不会被终止,直到结束该次循环为止。有些情况下,WHILE表达式的值在开始就是假,那么这些嵌套的语句将一次也不会被执行。 

        和使用IF语句类似,您可以在同一个WHILE循环中使用多个语句作为一个组,使用{  }或类似于下文的语法: 

        WHILE(expr):  statement  ...  ENDWHILE; 

        在下面的两个例子实现的功能是相同的,即打印了从1到10的所有数字: 

  

        /*  example  1  */ 

$i  =  1;while  ($i  <=  10)  { 

print  $i++;  /*  the  printed  value  would  be 

$i  before  the  increment 

(post-increment)  */ 



  

/*example  2  */ 

$i  =  1; 

while  ($i  <=  10): 

print  $i; 

$i++; 

endwhile; 

  

DO..WHILE 
        DO..WHILE循环和WHILE循环是十分类似的,除了真值检查是在每个循环过程最后进行的外。这里最主要的不同就是对于DO..WHILE循环,它和标准的WHILE循环不一样,它的第一个循环过程总是会被执行的(由于真值检查是在最后被执行的)。标准的WHILE循环中的第一个语句不一定被执行(由于真值检查是在循环开始时进行的)。 

  

        这儿是使用DO..WHILE循环语句的一个例子: 

$i  =  0; 

do  { 

print  $i; 

}  while  ($i>0); 

 

        上文的循环仅仅会被执行一次,在第一次循环执行完毕之后,检查表达式为假($I并不比0大)此时循环就会被终止。 

  

        高级的C语言使用者对使用DO..WHILE循环的不同之处会有很深的理解,为了允许在代码段的执行过程中终止执行,可以使用将他们加入DO..WHILE(0)语句中,再使用BREAK语句的方法。下面代码段说明了这一点: 

do  { 

if  ($i  <  5)  { 

print  "i  is  not  big  enough"; 

break; 



$i  *=  $factor; 

if  ($i  <  $minimum_limit)  { 

break; 



print  "i  is  ok"; 

...process  i... 

}  while(0); 

 

        如果您对这些都不是很明白的话,也不必担心。您可以在不使用这些特性的情况下编写出很强有力的代码。 

  

FOR 
        在PHP中FOR循环是最复杂的循环。它的特性和它在C语言中的表现类似。FOR循环的语法如下: 

  

        FOR  (expr1;  expr2;  expr3)  statement 

  

        第一个表达式expr1将在循环开始时无条件的被求解执行; 

        在每一个循环开始的时候,第二个表达式将被执行。如果它的值为真,则该循环将继续下面嵌套语句的执行。如果它的值为假,则循环结束; 

        在每个循环的最后第三个表达式将被执行。 

        任何一个表达式都可以是空的,当表达式二(expr2)是空的时候,意味这这个循环运行的次数将是不确定的(PHP和C一样默认该表达式为真)。这种做法并不象您想象的那样没有用,因为在有些情况下您可能希望使用带条件的BREAK语句来取代FOR的真值判断来作为终止循环的方法。 

  

        注意下面的几个例子,所有的这些语句显示了从1到10的数字: 

  

/*  example  1  */ 

for  ($i  =  1;  $i  <=  10;  $i++)  { 

print  $i; 



  

/*  example  2  */ 

for  ($i  =  1;;$i++)  { 

if  ($i  >  10)  { 

break; 



print  $i; 



  

/*  example  3  */ 

$i  =  1;for  (;;)  { 

if  ($i  >  10) 

{  break; 



print  $i; 

$i++; 



  

/*  example  4  */ 

for  ($i  =  1;  $i  <=  10;  print  $i,  $i++)  ; 

  

        当然,看上去第一个例子最好(或者是第四个例子),但是您将发现在许多场合使用空表达式的FOR循环是十分方便的。 

  

        在FOR循环中PHP也支持交互的“冒号语法”。例如: 

        FOR  (expr1;  expr2;  expr3):  statement;  ...;  endfor; 

  

        其他有FOR语句的语言往往使用该语句来处理数组。在PHP中使用WHILE语句和list()和each()函数来做这件事情。请参考这些函数相关的例子。 

  

BREAK 
        BREAD  跳出当前的循环体,提前结束循环. 

$i  =  0; 

while  ($i  <  10)  { 

if  ($arr[$i]  ==  "stop")  { 

break; 



$i++; 



 

CONTINUE 
        CONTINUE结束本次循环,跳到循环体的开始处,接着进行下一次循环的判定. 

while  (list($key,$value)  =  each($arr))  { 

if  ($key  %  2)  {  //  skip  even  members 

continue; 



do_something_odd  ($value); 



 

SWITCH 
        在实际问题中常常需要用到多分支的选择.你可以使用多重嵌套的IF语句来处理,但如果分支较多,则嵌套的IF语句层数多,程序冗长而且可读性降低.PHP中提供SWITCH语句来直接处理多分支选择. 

        下面的两个例子使通过两种不同的方式来实现同一件事,一个使用了一系列的IF语句,另外一个使用了SWITCH语句: 

  

/*  example  1  */ 

  

if  ($i  ==  0)  { 

print  "i  equals  0"; 



if  ($i  ==  1)  { 

print  "i  equals  1"; 



if  ($i  ==  2)  { 

print  "i  equals  2"; 



  

/*  example  2  */ 

  

switch  ($i)  { 

case  0: 

print  "i  equals  0"; 

break; 

case  1: 

print  "i  equals  1"; 

break; 

case  2: 

print  "i  equals  2"; 

break; 



  

        为了理解SWITCH语句为了躲避语句冗长,知道它如何被执行的是非常重要的.SWITCH语句石一行一行          执行的(事实上,是一条语句一条语句).在开始时,没有代码被执行.仅仅当一个值于SWITCH表达式的语句的值相同的CASE语句被发现后,PHP继续执行语句直到SWITCH体的结束,或者出现了BREAK语句.如果你在一个分支语句的后面没有写BREAK语句,PHP将继续执行下面分支的语句.例如: 

  

/*  example  3  */ 

  

switch  ($i)  { 

case  0: 

print  "i  equals  0"; 

case  1: 

print  "i  equals  1"; 

case  2: 

print  "i  equals  2"; 



  

        这里,如果$i等于0,PHP将会执行所有打印语句.如果$i等于1,PHP将会执行剩下的两个打印语句,并且仅仅当$i等于2的时候,你才能得到你期望的执行结果,只有’I  equals  2’被显示.因此不要在每一个分支语句的后面忘记BREAK语句(即使你在一定的环境下有可能想避免提供他们). 

        一个特殊的分支是默认的分支.这个分支可以匹配任何其它分支没有匹配的事情.例如: 

  

/*  example  4  */ 

  

switch  ($i)  { 

case  0: 

print  "i  equals  0"; 

break; 

case  1: 

print  "i  equals  1"; 

break; 

case  2: 

print  "i  equals  2"; 

break; 

default: 

print  "i  is  not  equal  to  0,  1  or  2"; 



  

        另外一个值得一提的事实是CASE表达式可以是任何计算标量类型的表达式,也就是说,整型或实型和字符型.数组和对象将不会导致PHP崩溃,但是他们没有没有任何意义. 

  

REQUIRE 
        REQUIRE语句使用指定的文件来代替它自己,与C语言中的#include语句非常相似。这意味着你不能把一个require()语句放在一个循环体中,并且期望它在每一次反复中都包含不同文件的内容.为了达到这个目的,可以使用INCLUDE语句。 

        require  ('header.inc'); 

          

INCLUDE 
        INCLUDE语句包括和计算指定文件. 

        在每次遭遇INCLUDE语句的时候都会进行一次.因此你可以在一个循环体中使用INCLUDE语句.以用来包含一些不同的文件. 

$files  =  array  ('first.inc',  'second.inc',  'third.inc'); 

for  ($i  =  0;  $i  <  count($files);  $i++)  { 

include($files[$i]); 

}

        INCLUDE()与REQUIRE()语句是不同的,include语句是每一次都重新计算(并且仅仅当它被执行的时候),而require()语句当他第一次被碰到的时候,用指定的文件来代替它本身,无论这个文件的内容是否被计算(例如,如果它出现在一个条件为FALSE的if语句中). 

        因为include()是一个特殊的语言结构,你必须在一个语法块中封闭它,如果它在一个条件块中. 

  

        /*错误,不会同设想一样工作.  */ 

 

if  ($condition) 

include($file); 

else 

include($other); 

  

/*下面是正确的.  */ 

  

if  ($condition) 



include($file); 



else  { 

include($other); 



  

        当一个文件被计算的时候,语法分析将处在”HTML-模式”中,这个模式将输出这个文件的内容直到第一个PHP开始标签(<?)被遇到. 

        参考  readfile(),virtual().