表达式

表达式是 PHP 最重要的基石。在 PHP 中,几乎所写的任何东西都是一个表达式。简单但却最精确的定义一个表达式的方式就是“任何有值的东西”。

最基本的表达式形式是常量和变量。当键入“$a = 5”,即将值“5”分配给变量 $a。“5”,很明显,其值为 5,换句话说“5”是一个值为 5 的表达式(在这里,“5”是一个整型常量)。

赋值之后,所期待情况是 $a 的值为 5,因而如果写下 $b = $a,期望的是它犹如 $b = 5 一样。换句话说,$a 是一个值也为 5 的表达式。如果一切运行正确,那这正是将要发生的正确结果。

稍微复杂的表达式例子就是函数。例如,考虑下面的函数:

<?php
function foo ()
{
    return 
5;
}
?>

假定已经熟悉了函数的概念(果不是的话,请看一下函数的相关章节),那么键入 $c = foo() 从本质上来说就如写下 $c = 5,这没错。函数也是表达式,表达式的值即为它们的返回值。既然 foo() 返回 5,表达式“foo()”的值也是 5。通常函数不会仅仅返回一个静态值,而可能会计算一些东西。

当然,PHP 中的值常常并非是整型的。PHP 支持四种标量值(标量值不能拆分为更小的单元,例如和数组不同)类型:整型值(integer),浮点数值(float),字符串值(string)和布尔值(boolean)。PHP 也支持两种复合类型:数组和对象。这两种类型具可以赋值给变量或者从函数返回。

PHP 和其它语言一样在表达式的道路上发展,但推进得更深远。PHP 是一种面向表达式的语言,从这一方面来讲几乎一切都是表达式。考虑刚才已经研究过的例子,“$a = 5”。很显然这里涉及到两个值,整型常量 5 的值以及而且变量 $a 的值,它也被更新为 5。但是事实是这里还涉及到一个额外的值,即附值语句本身的值。赋值语句本身求值为被赋的值,即 5。实际上这意味着“$a = 5”,不必管它是做什么的,是一个值为 5 的表达式。因而,这样写“$b = ($a = 5)”和这样写“$a =5; $b=5”(分号标志着语句的结束)是一样的。因为赋值操作的顺序是由右到左的,也可以这么写“$b = $a =5”。

另外一个很好的面向表达式的例子就是前、后递增和递减。PHP 和多数其它语言的用户应该比较熟悉变量 ++ 和变量 -- 符号。即递增和递减运算符。在 PHP/FI 2 中,语句“$a++”没有值(不是表达式),这样的话你便不能为其赋值或者以任何其它方式来使用它。PHP 通过将其变为了表达式,类似 C 语言,增强了递增/递减的能力。在 PHP 和 C 语言 中,有两种类型的递增前递增和后递增,本质上来讲,前递增和后递增均增加了变量的值,并且对于变量的影响是相同的。不同的是递增表达式的值。前递增,写做“++$variable”,求增加后的值(PHP 在读取变量的值之前,增加变量的值,因而称之为“前递增”)。后递增,写做“$variable++”,求变量未递增之前的原始值(PHP 在读取变量的值之后,增加变量的值,因而叫做“后递增”)。

一个常用到表达式类型是比较表达式。这些表达式求值 FALSETRUE。PHP 支持 >(大于),>=(大于等于),==(等于),!=(不等于),<(小于),<= (小于等于)。PHP 还支持全等运算符 ===(值和类型均相同)和非全等运算符 !==(值或者类型不同)。这些表达式都是在条件判断语句,比如,if 语句中最常用的。

这里,将要研究的最后一个例子是组合的运算赋值表达式。已经知道如果想要为变量 $a 加1,可以简单的写“$a++”或者“++$a”。但是如果想为变量增加大于 1 的值,比如 3,该怎么做?可以多次写“$a++”,但这样明显不是一种高效舒适的方法,一个更加通用的做法是“$a = $a + 3”。“$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 的值中减去 5),“$b *= 7”(变量 $b 乘以 7),等等。

还有一个表达式,如果没有在别的语言中看到过的话,可能看上去很奇怪,即三元条件运算符:

$first ? $second : $third
如果第一个子表达式的值是 TRUE(非零),那么计算第二个子表达式的值,其值即为整个表达式的值。否则,将是第三个子表达式的值。

下面的例子一般来说应该有助于理解前、后递增和表达式:

<?php
function double($i)
{
    return 
$i*2;
}
$b $a 5;        /* assign the value five into the variable $a and $b */
$c $a++;          /* post-increment, assign original value of $a
                       (5) to $c */
$e $d = ++$b;     /* pre-increment, assign the incremented value of
                       $b (6) to $d and $e */

/* at this point, both $d and $e are equal to 6 */

$f double($d++);  /* assign twice the value of $d before
                       the increment, 2*6 = 12 to $f */
$g double(++$e);  /* assign twice the value of $e after
                       the increment, 2*7 = 14 to $g */
$h $g += 10;      /* first, $g is incremented by 10 and ends with the
                       value of 24. the value of the assignment (24) is
                       then assigned into $h, and $h ends with the value
                       of 24 as well. */
?>

一些表达式可以被当成语句。这时,一条语句的形式是 'expr' ';',即一个表达式加一个分号结尾。在“$b=$a=5;”中,$a=5 是一个有效的表达式,但它本身不是一条语句。“$b=$a=5;”是一条有效的语句。

最后一件值得提起的事情就是表达式的真值。在许多事件中,大体上主要是在条件执行和循环中,不要专注于表达式中明确的值,反而要注意表达式的值是否是 TRUE 或者 FALSE。常量 TRUEFALSE(大小写无关)是两种可能的 Boolean 值。如果有必要,一个表达式将自动转换为 Boolean。参见类型强制转换一节。

PHP 提供了一套完整强大的表达式,而为它提供完整的文件资料已经超出了本手册的范围。上面的例子应该为你提供了一个好的关于什么是表达式和怎样构建一个有用的表达式的概念。在本手册的其余部分,我们将始终使用 expr 来表示一个有效的 PHP 表达式。

add a note add a note

User Contributed Notes 21 notes

up
25
yasuo_ohgaki at hotmail dot com
16 years ago
Manual defines "expression is anything that has value", Therefore, parser will give error for following code.

<?php
($val) ? echo('true') : echo('false');
Note: "? : " operator has this syntax  "expr ? expr : expr;"
?>

since echo does not have(return) value and ?: expects expression(value).

However, if function/language constructs that have/return value, such as include(), parser compiles code.

Note: User defined functions always have/return value without explicit return statement (returns NULL if there is no return statement). Therefore, user defined functions are always valid expressions.
[It may be useful to have VOID as new type to prevent programmer to use function as RVALUE by mistake]

For example,

<?php
($val) ? include('true.inc') : include('false.inc');
?>

is valid, since "include" returns value.

The fact "echo" does not return value(="echo" ls not a expressionl
de>
up
6 25
16 years ago
operatts thClor , ed.exc) :iere()lloops.;*/

<?;*/
?&);
<?;*/
(&c " )
{
&nb ce ec "
?&);
Th>Thbecato uth o" dn'torm u="ta to haaent parser ma-t">operaonlt'" os Ons'>Supportathis syfuncns'gar) :iere()lloop s="happe In C, licwould to habere ">o>Aff OnlegitimRelsul to hake t:;*/
()
{
&nbype a, b;;*/
&nb a = 2, b = 4;;*/&nb ot retua;;*/Fopre w t:;*/
()
{
&nbype a, b;;*/
&nb a = (2, b = 4);;*/&nb ot retua;;*/
de>
up
16 25
[Ittmail deModm
16 years ago
bool ge.operato;*/
't,use f2()h>Tn'torunlid, sinnglsge.express/> 'taueywayo;*/
'fa,use f2()h>Tn'torunlid, sinnglsge.express/> 'faaueywayo;*/TreRso:ierehas thbe Behavio="HNoton+pab Onfrom nglsnt progrstri; For exam:;*/
Fbelowils nnullvengln sp;theTh>ThimSuppant,hbecato uip;ofytul h" accauesarray whofaauddexprh>Thinis valinglsnt prog/>
de>
up
12 25
16 years ago
Variablp;af licor hbere 'e="chfi',hbtholico" dn'tone accs>V Onsta>Ncts thlicsd uld toppre AFTERauesops va ession oServ(oninglserntrary,led a[It"patoof he f)o;*/&nb sd uld bac"from 3 * 3ype o 4 * 3";*/
de>
up
10 25
16 years ago

<?;*/
dou".;*/
double({
&nbyot retu "
Variab$e sxam.;*/
({
&nbyot retu "
?&);
For exam:;*/

<?;*/
Teasies nwayctoorun ause functiiotul ptho()lup;af lis s="n,)erntaisythiitsa;
double((?&);
ue a15,iwhichFaTh sp;not return vaeoofa/>dou>ue a$e sxamswgln opplliftul nglsnumbey 5o;*/<?;*/douinc'?&);
Fononymousned functiswgln ngly e the prevu="tatheeRelatasned functiswgln lt'"theVa-non />For exam:;*/

<?;*/&nb />&nb tax  douinc'(?&);
eReythiacpe str)ch afa/>Othnganiloohstr) />Fgd Geic); Thmakaeo">doui(5)"einis valiso w;theVariasnt). Th icauete.otswaycaround); For exam:;*/

<?;*/(douinc'(?&);
ue a15hbecato u"call_s="u_ed f" callbd surned functis />a/>Th>Thpopreriabbecato uif ype str gB">douieue anglsueonymousned funct;*/Ncts thwein<?;*/(?&);
eReFor exameoof ngiions arrray_mapeue arrray_reducf.)>
de>
up
1 25
f="h://r2.php.net/manuetion/language.operators.comparison.ra;< ;*/Tir, $a iiosp;eqaul $blup;af ew type-juggli); Tir, $a iiosp;eqaul $bveue anglyons aof nglss="neew t. ;*/'fa";;*/
up
7 25
16 years ago
operaticauube usefwayaof avoidythi, sonpreirever, rn statems.sp;&nb dglyon &temf s s.sp;&nb s. {
&nby$pe str)= 'foo' > {
&nby$pe str)= 'bar' >
Tabovein't,u$pe str)icaup;assig 'foo'veue aifnlt'" ">'fa,u$pe str)icaup;assig 'bar'lue.

up
25
'zanauhenoyahoo?="H!arodm
16 years ago
operaonIcwould oa'>Othsaycts thif ybes nopunctiiotul enclofaaull tse s "expressiin > &pemf s s,tul hvoidive erseue aimproveinlompty:;*/

<?;*/&c " : ?&);
Ft;?, C++veue a"/y te.otson/languang that hit.)>
de>
up
25
16 years ago
Suo uif ydoprlt">os won notmo gii n :ieuturenth oweressio;*/
OthnicNcto wmptm:;*/
n("foo","r") or die("Ee er!");;*/
de>
up
4 25
16 years ago
up
25
16 years ago
letlnglss;$secF'=', you' wiletla ), paive eriereharyythitoaup;ass aays uetul dd an-ys>Varia.)>
de>
up
2 25
16 years ago
&l;*/
({
&nby />&nb ce ec "
't"p; 'fa"p; 'fa;*/
?&);
&l;*/
(({
&nby />&nb ce ec "
't"p; 'fa"p; 't;*/
?&)>
de>
up
-2 25
os il dot com
16 years ago
<?;*/
bools ge.expr d)r hse str)crgi) :i&nby />&nb er C="t:;*/
&nby />&nb />&nb />&nb 1.sp;&nb IFgd Gea>Ncuesarray of s="co>os;*/
&nby />&nb />&nb />&nb 2.sp;&nb IFdys="entllytgd Gea>Ncuser.cound)n">bool atabd ssss;lectif s="co>osi :inglsarray />
&nby />&nb />&nb />&nb />&nb />&nb />&nb />&nb />Notd, sinnglsrealsarray ths), paonIcmushoto uif y'empty'st">opera />
&nby />&nb />&nb />&nb 3.sp;&nb Wgln Ins'bmihonglser.cound)n">bool as tse s "expressiof asp'if'urn statem, />
&nby />&nb />&nb />&nb />&nb />&nb if y'if'uoppr yeaul o solve ONLYikeefop;fiheamcremaof nglser.cound)n">bool.;*/
&nby />&nb er cluress:uoppr yeaul ay aasd Sh-circui"lowiiss't;*/
(((((&>{?&"p; &>{?&"p;
opera />
&>{?&"p; &>{?&"p;
(
((({
&nby />&nb ce ec "
&>{?&"p; &>{?&"p;
os.ot che
?&);
&nb Surenburious!n>
de>
up
-2 25
16 years ago
Tn'toV Onsta>Ncts thlicsd uld toppre AFTERauesops va ession oServ(oninglserntrary,led a[It"patoof he f)o;*/Foabur) :its th"imSupreria-to-bextkveso-yery-srexam" pie a of s=dNcts thusNotone-/pp;po's, rmcrmbey ng>Thpopt. :))*/
up
-3 25
operat.excedfech. Newbiaeosd uld er dei-nlynlearn tsem,hbtholf ngliroto uexpefas) :icrdNcts tho" ls neasynkr rma aysuosd uld to u> &temf s s.y />Tawo rmSuppantike ngsFaTh sp thlices/wssnt parlynAND >Thmaintaisariabbyaysuoue ate.ots.)>
de>
up
-4 25
Affhlicsd uld be ssiaa7%nenofnlt'" ">d, eriat leastoay an s "expressiof lt'" ">doue als npartiof aspap;assatem, $secintat ay es tHowe.)>
de>
up
- 25

&l= $varp; (: ?&);
Tpattbinss "expressiin > &temf siiswgln uoweine accs>y (suchFas to ythimefaixaelid expressi ay neselattattbinsge.expressi));

Tabovein uld loohi7% l:;*/

&l= p; ((: ?&);
&temf siiswgln usythis"HNanythiSIMILARtul:;*/

<?;*/
(((: ?&);
Othnganit/>T />&l= t">?&)> Ttemgre s "expressiin upnt p>Va-nu> &temf siism hei yield tnd sirariabexpefas)as well..hbthoI'mhes nquptm surN.)>
de>
up
-6 25
16 years ago
<?;*/
b(">'t)vernFops va Notr hei-to-left;*/?&);
os]hmakaanoalan&pemen abithonglseywatoof ops va ess"o;*/f="hs://buri.r2.php.nburote.php?61188ra;
de>
up
-13 25
leail dge=lleysat shawail doacom
16 years ago
<h the
&>{">?&"p; : &>{">?&"p; : ue a\$a =: " &>{">?&"p; &>{">?&"p; &>{">?&"p; : &>{">?&"p; : ue a\$a =: " &>{">?&"p; ?&);
de>
up
-14 25
&cIt'caulsl h goudxt"uatul to u> &temf siiswgln usythis"HNanythiSIMILARtul:;*/&c */&c /><?;*/
(((: &c " ?&);
Tpattbins$secintateqat">opera, to haLOWERt.excedfechhnganit/>Ter.compariige.operatvesoanglyonlmp;p NEVERtneift> &temf s sFaTound)nglirosubge.expressio;*/
T> &temf s sFsuggeselataboveiB" does nchn/leinglsmeasythiof nglserde,hbthongliroto umisleads) :ge.erifechdent programs soout Affh wat ng ngsF7% like tswr wies/w in ausimilarim"/ner:;*/

<?;*/
(((((: ?&);
Othnganikeyryythitwat crdNco" dn'toes/w ch ge.ectiflid,exay learn tset.excedfechhouameo( f="h://www.r2.php.net/manuetion/language.operatoon.ra;<)esoangahocto ge.ects tse r hei ng ngs.)>
de>
-14 25
&nby />&nb p"stt:array() ==rns NU? "Trudat: "F>'fa";;*/&nby />&nb p"stt:" (" . (array() ==rns N) . ")\n";;*/&nby />&nb $arr =:array();;*/&nby />&nb p"stt:array() ==r$arr ? "Trudat: "F>'fa";;*/&nby />&nb p"stt:" (" . (array() ==r$arr) . ")\n";;*/&nby />&nb p"stt:s="co(array()d . "\n";;*/&nby />&nb p"stt:s="co(ns N) . "\n";;*/&nby />&nb Trud (1) />&nby />&nb Trud (1) />&nby />&nb 0 />&nby />&nb 0 />
Othi to hans NU/>Funnemptysarray swr wiulsl to hakr to ugutew t().ike tsseemths"HN kie aof wlirine/>Fme,hal witgwisf iur"e ts thaabug,hs"HNbodycsd uld tov ano icNdiitoayerefo;*/
de>
> m="t>add dd ate)> m="t>ra;> efunct>25 efunct>