PHP8 表達(dá)式

2023-08-15 13:46 更新

表達(dá)式是 PHP 最重要的構(gòu)建部分。在 PHP 中,幾乎所寫的任何東西都是表達(dá)式。簡單但卻最精確的定義表達(dá)式的方式就是“任何有值的東西”。

最基本的表達(dá)式形式是常量和變量。當(dāng)鍵入 $a = 5,即值 5 將分配給變量 ?$a?。很明顯,5的值為 5,換句話說 5 是一個(gè)值為 5 的表達(dá)式(在這里,5 是一個(gè)整型常量)。

賦值之后,期待 ?$a? 的值為 5,因而如果寫下 $b = $a,則期望其行為就像 $b = 5 一樣。換句話說,?$a? 也是值為 5 的表達(dá)式。如果一切正確,那這正是將要發(fā)生的事情。

稍微復(fù)雜的表達(dá)式例子就是函數(shù)。例如,考慮以下函數(shù):

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

假如已經(jīng)熟悉了函數(shù)的概念(如果沒有,請查看函數(shù)的相關(guān)章節(jié)),那么本質(zhì)上鍵入 $c = foo() 就如同寫下 $c = 5,這是對的。函數(shù)是具有返回值的表達(dá)式。由于 foo() 返回 5,表達(dá)式“foo()”的值也是 5。通常函數(shù)不僅會返回靜態(tài)值,還會計(jì)算一些東西。

當(dāng)然,PHP 中的值并非都是整型的。PHP 支持四種標(biāo)量值(標(biāo)量值不能拆分為更小的單元,例如,和數(shù)組不同)類型:int 值、浮點(diǎn)數(shù)值(float)、string 值和 bool 值。PHP 也支持兩種復(fù)合類型:數(shù)組和對象。這些值類型可以賦值給變量或者從函數(shù)返回。

PHP 和其它語言一樣在表達(dá)式的道路上發(fā)展,但推進(jìn)得更深遠(yuǎn)。PHP 是一種面向表達(dá)式的語言,從這一方面來講幾乎一切都是表達(dá)式??紤]剛才已經(jīng)研究過的例子 $a = 5。很顯然這里涉及到兩個(gè)值,整數(shù)常量 5 的值以及變量 ?$a? 的值,也被更新為 5。但事實(shí)是這里還涉及到一個(gè)額外的值,即附值語句本身的值。賦值語句本身求值為被賦的值,即 5。實(shí)際上這意味著 $a = 5,無論做什么,都是一個(gè)值為 5 的表達(dá)式。因此編寫 $b = ($a = 5) 跟編寫 $a = 5; $b = 5;(分號標(biāo)志著語句的結(jié)束)是一樣的。因?yàn)橘x值操作的順序是由右到左的,也可以寫成 $b = $a = 5。

另外一個(gè)很好的面向表達(dá)式的例子就是前、后遞增和遞減。PHP 和多數(shù)其它語言的用戶應(yīng)該比較熟悉 variable++ 和 variable-- 符號。即遞增和遞減運(yùn)算符。在 PHP 和 C 語言中,有兩種類型的遞增——前遞增和后遞增。本質(zhì)上來講,前遞增和后遞增均增加了變量的值,并且對于變量的影響是相同的。不同的是遞增表達(dá)式的值。前遞增,寫做 ++$variable,求增加后的值(PHP 在讀取變量的值之前,增加變量的值,因而稱之為“前遞增”)。后遞增,寫做 $variable++,求 ?$variable? 未遞增之前的原始值(PHP 在讀取變量的值之后,增加變量的值,因而叫做“后遞增”)。

一個(gè)常用到的表達(dá)式類型是比較表達(dá)式。這些表達(dá)式求值 false 或 true。PHP 支持 >(大于)、>=(大于等于)、==(等于)、!=(不等于)、<(小于)、<= (小于等于)。PHP 還支持全等運(yùn)算符 ===(值和類型均相同)和非全等運(yùn)算符 !==(值或者類型不同)。這些表達(dá)式都是在條件判斷語句,比如 if。

這里,將要研究的最后一個(gè)例子是組合的運(yùn)算賦值表達(dá)式。已經(jīng)知道如果想要為變量 ?$a? 加 1,可以簡單的寫 $a++ 或者 ++$a。但是如果想為變量增加大于 1 的值,比如 3,該怎么做?可以寫 $a++ 多次,但這樣明顯不是一種高效舒適的方法,一個(gè)更加通用的做法是 $a = $a + 3。$a + 3 計(jì)算 ?$a? 加上 3 的值,并將其賦予給 ?$a?,于是 ?$a? 的值增加了 3。在 PHP 及其它幾種類似 C 的語言中,可以以一種更加簡短的形式完成上述功能,隨著時(shí)間的推移,會變得更加清晰、更容易理解。為 $a 的當(dāng)前值加 3,可以這樣寫 $a += 3。這里的意思是“取變量 ?$a? 的值,加 3,得到的結(jié)果再次分配給變量 ?$a?”。除了更短和清楚外,也可以加快執(zhí)行速度。$a += 3 的值,如同一個(gè)正常賦值操作的值,是賦值后的值。注意它不是 3,而是 $a 的值加上3 之后的值(此值將被賦給 $a)。任何二元運(yùn)算符都可以用運(yùn)算賦值模式,例如 $a -= 5(從變量 ?$a? 的值中減去 5),$b *= 7(變量 ?$b? 乘以 7),等等。

還有一個(gè)表達(dá)式,如果沒有在別的語言中看到過的話,可能看上去很奇怪,即三元條件運(yùn)算符:

<?php
$first ? $second : $third
?>

如果第一個(gè)子表達(dá)式的值是 true(非零),那么計(jì)算第二個(gè)子表達(dá)式的值,其值即為整個(gè)表達(dá)式的值。否則,將第三個(gè)子表達(dá)式的值作為整個(gè)表達(dá)式的值。

下面的例子有助于更好的理解前、后遞增和表達(dá)式:

<?php
function double($i)
{
return $i*2;
}
$b = $a = 5; /* 賦值 5 到變量 $a 和 $b */
$c = $a++; /* 后自增,將 $a(5)的原始值賦給 $c */
$e = $d = ++$b; /* 前自增,將 $b(6)的遞增值賦給 $d 和 $e */

/* 此時(shí), $d 和 $e 都等于 6 */

$f = double($d++); /* 自增前將兩倍值賦值給 $d ,即 2*6 = 12 賦值給 $f */
$g = double(++$e); /* 自增后將兩倍值賦值給 $e ,即 2*7 = 14 賦值給 $g */
$h = $g += 10; /* 首先,$g 自增 10 后等于 24。然后將值(24)賦值給了 $h,
$h 的值也等于 24。 */
?>

一些表達(dá)式可以被當(dāng)成語句。這時(shí),一條語句的形式是 'expr ;',即一個(gè)表達(dá)式加一個(gè)分號結(jié)尾。在 $b = $a = 5; 中,$a = 5 是一個(gè)有效的表達(dá)式,但它本身不是一條語句。$b = $a = 5; 是一條有效的語句。

最后一件值得提起的事情就是表達(dá)式的真假值。在許多事件中,主要是在條件執(zhí)行和循環(huán)中,不要關(guān)心表達(dá)式中的具體值,反而要注意表達(dá)式的值是否是 true 或者 false。常量 true 和 false(大小寫無關(guān))是兩種可能的 布爾值。必要時(shí),表達(dá)式將自動轉(zhuǎn)換為布爾值。參見類型強(qiáng)制轉(zhuǎn)換獲取詳細(xì)信息。

PHP 提供了一套完整強(qiáng)大的表達(dá)式實(shí)現(xiàn),并且完全紀(jì)錄它超出了本手冊的范圍。上面的例子幫助了解了表達(dá)式的概念以及如何構(gòu)建有用的表達(dá)式。在本手冊的其余部分,將編寫 ?expr? 來指示任何有效的 PHP 表達(dá)式。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號