本節名稱暗示,操作符促進操作。PHP中有很多種操作符,常用的有:
- 賦值操作符——給變量賦值
- 算數運算符——執行基本的數學計算
- 字符串操作符——合併字符串
- 數據比較符——比較兩個數據
- 布爾邏輯運算符——通過布爾進行邏輯判斷
PHP同時提供了其他操作符:
- 位操作符——手動位操作
- 錯誤控制符——控制錯誤顯示
- 執行操作符——執行系統指令
- 遞增/遞減——數值遞增遞減
- 類型操作符——識別對象
作者提示:有極少數情況,PHP的操作符是二元操作符——需要兩個操作數,所有的二元操作符都是夾在兩個操作數中間(如,2 + 2)。
1.6.1 算數運算符
算術運算可以提供基本的數學算術運算:
加 | $a = 1 + 3.5; |
減 | $a = 4 – 2; |
乘 | $a = 8 * 3; |
除 | $a = 15 / 5; |
取餘 | $a = 23 % 7; |
- 如果操作符在操作數後面,先返回這個操作數,然後做遞增/遞減操作。
- 如果操作符在操作數前面,先做遞增/遞減操作,然後返回操作後的結果。
下面是例子:
作者提示:過度使用遞增遞減會讓代碼難以閱讀——甚至經驗豐富的程序員有時也會對一些難懂的遞增遞減操作而頭疼。因此,注意控制自己不要濫用。
遞增/遞減還有一個重點——作用在一個表達式或者一個硬編碼的表兩值時容易導致解釋器拋出一個錯誤。並且,變量通過遞增遞減操作會自動轉換成數值型——結果就是返回1,因爲字符Test被轉換爲整形時爲0,然後自增到了1返回:
1.6.2 字符串操作符
與很多其他不言不同的是PHP可以把兩個字符串連起來:
這裏請記住這是不僅是合適的連接字符串的方法,也是唯一的方法。使用加操作符會使字符串轉換成數值,然後進行算術元預算內(結果也就變成了數值)。
1.6.3 位操作符
位運算符提供手動操作位數據。所有的爲操作符都是用來操作整數的——因此,解釋器在執行位操作之前試圖將操作數轉換成整型。
最簡單的位操作符是按位非,反轉所有整數的位(0設爲1,1設爲0):
以下列出一組用於位比較的操作符,需要兩個操作數:
& | 按位與。把兩個操作數中都爲1的位設爲1 |
| | 按位或。把兩個操作數中該位一個0一個1設爲1,其餘設爲0 |
^ | 按位異或。把兩個操作數不同的位設爲1 |
這些操作符並不難理解——可能OR會稍難一些,第一印象好像是奇數。實際上非常簡單:當兩個操作數在該位上是不同時,設爲1,相同時(比如同時爲1或者同時爲0)設爲0。
第三部分的操作符用來位移:
<< | 左位移。將位左移幾位,移出的位用0補齊。 |
>> | 右位移。將位右移幾位,移出的位用0補齊。 |
這些操作符可以產生一個有趣的且速度極快的乘法效果,如:
無論如何請明白,位操作符能夠估算出兩個數之間的相乘或者相除結果,並非精準——尤其是產生溢出的計算中會得到出乎意料的結果。在32位系統中將發生下面情況:
第二行中的例子,實際上因該輸出0——因爲所有的位都已經被移走。第三行中返回的實際值4,294,967,296——返回值類型是浮點型,已經能夠很好的說明32位系統無法精確計算這樣的數值。
Siemen注:這裏爲什麼說pow返回浮點型就說明無法精確計算呢?因爲pow在官方手冊記載這個方法在可以表達的範圍內返回的是整型值,否則返回浮點型,如果無法被計算則返回false。傳送門:http://cn.php.net/manual/en/function.pow.php
1.6.4 賦值操作符
鑑於本節富有創意的命名可以證明一點,你可能很難想象賦值操作符可以將一個值賦給一個變量。(Siemen注:這句翻得不好,其實沒有看的很明白)最簡單的賦值操作符就是等號,之前很多例子中都看到過的:
另外這個複製操作符還可以配合所有二元算數運算符與位操作符來對自身做的操作:
在這個例子中,就等同於執行了$variable = $variable + 3的操作。類似這樣的組合適用所有算數二元運算符和位運算符。
1.6.5 引用操作符
默認情況下,賦值操作符作用於值——確實,這實質上是一種複製的行爲。賦值的兩個變量沒有任何聯繫,只是內容完全相同,如果賦值完成後其中一個變量發生了改變,與另一個沒有任何關係(也就是另一個還是保持賦值之前的值),不存在引用關係:
很顯然你可以預料到這個結果,但你想要讓$a與$b存在引用關係,也就是兩者相互聯繫:
作者提示:賦值操作符可以作用於任何類型數據(這裏只建立複製關係),除了對象,不管你在用等號時有沒有用到&符號都是建立引用關係。
使用引用關係的變量有的時候非常有用,同時伴隨着風險,引用會使變量長期存在不容易釋放內存,甚至只是單獨的方法也不例外。另外,不像其他語言那樣,PHP使用引用變量往往效率沒有使用非引用變量來的高,其原因就是PHP採用“延時拷貝”的機制優化了普通賦值的效率。
1.6.6 比較操作符
比較操作符是建立在兩個值之間的是否相等操作的二元操作符。可以在任意兩個值之間進行等相等和大小的比較。比較返回的結果通常是布爾類型的。以下是一組相等比較符:
== | 相等。兩邊值相等返回true,不等則返回false,不需要兩個值的類型都相等。 |
=== | 全等。這個不僅要值相等,值的數據類型也必須相等纔會返回true,否則返回false。 |
!= | 不等。兩邊值不相等返回true,相等則返回false,不檢查值類型是否相等。 |
!== | 全不等。只有兩邊值不相等並且值得類型也不相等時才返回true,否則返回false。 |
你可以想像,賦值操作符與相等操作符非常容易混淆,事實上,這是程序員經常犯迷糊的地方。這裏提供一條避免發生這類問題的建議,如果是一個變量和一個直接量比較,那麼把直接量作爲第一個操作數,比如:
你可以把它寫成:
這樣就可以很明顯的區分賦值符與相等符——賦值符左邊必須是變量,如果你不小心把 == 寫成了 = 或者反過來,那麼這樣可以讓解釋器幫助你找到錯誤,解釋器會拋出一個異常,警告你什麼地方發生了錯誤。
下面有一組不同的比較操作符,用於比較出兩個中哪個更大些:
< 和 <= | 左邊小於(小於等於)右邊,返回true,否則返回false |
> 和 >= | 左邊大於(大於等於)右邊,返回true,否則返回false |
很明顯,比較的規則與比較值得類型有關。比較數值就是比較位數據;比如說字符牀的比較就是比較兩個值的比特數據,直到出現了不同的比特值,然後將其作爲數值對這兩個不同的比特進行比較。例如:
以上代碼輸出0(也就是false),因爲在$right中字母D高於對應在$left中的字母C。你可能會覺得這只是在利用字母順序來比較,與現實中的字母比較沒有差別。那麼請考慮下面例子:
這個例子的結果是1(也就是true),因爲小寫a的ascii碼是97大於大寫A的65。顯然這樣的處理不利於對文本的比較,我們需要利用其他方法來解決,這點會在字符串章節中有介紹。
作者提示:將比較操作符作用於數組時,比較規則另有不同,具體會在數組章節詳細介紹。
1.6.7 邏輯運算符
邏輯運算福通常被用於比較兩個布爾值得出第三個布爾值。PHP中有四種邏輯運算符,其中三種是二元運算符。唯一一個不是一元運算符就是邏輯非,用於逆轉單個操作數:
所有邏輯運算符都是基於布爾值的;因此PHP會首先將要進行邏輯運算的兩個操作數轉換成布爾值。三個二元運算符:
&& / and | 當兩邊同時爲true時返回true,其餘情況返回false。 |
|| / or | 只有兩邊同時爲false時返回false,其餘情況返回true。 |
XOR | 只有當兩邊其中之一爲true時才返回true,全true全false的情況都返回false。 |
記住一點,簡潔爲邏輯運算的上上策。例如,AND運算中第一個操作符就是false,那麼第二個操作符解釋器就不會上去判斷了,會立刻返回false。
提高邏輯運算效率的救命稻草有很多種,萬變不離其中的是儘可能在第一個操作符上就可以敲定結果。
1.6.8 其他運算操作符
除了之前講過的所有操作符外,PHP也會在某些任務中使用一些特殊的操作符。其中一個就是錯誤抑制符@;當它出現在一個表達式之前,那個表達式產生的幾乎所有錯誤信息都會被解釋器忽略:
以上代碼可以抑制調用mysql_connect()時輸出的錯誤信息,僅限於PHP內部功能性的錯誤。沮喪的是,一些類庫會立刻輸出錯誤信息,然後再移交至PHP,因此很難去抑制此種錯誤消息的輸出。
反引號(Siemen注:具體位置是鍵盤Esc正下方)操作符可以執行系統指令並返回輸出值。例如,我們可以輸出UNIX執行ls命令的結果存入變量$a:
作者提示:弄清楚這個是反引號,不要與但引號混淆。
1.6.9 運算符優先級
我們學完了操作符,那麼不是所有操作符的優先級都相同。當我們使用一系列的操作符組成一個表達式的時候會出現很多歧義的地方需要理順。這些可以歧義有兩種方法可以解決:使用括號表示那些操作符應該先執行,或者記住這些操作符內部的默認優先順序。
即使我們確定了每個操作符的優先級,但我們仍然缺少一個重要的規則:我們怎麼去執行擁有相同優先級的操作符?這個要取決於操作符的關聯性,有些從左往右,有些從右往左或者沒有任何關聯性。
下面這個表格展示了每一個操作符的優先級和關聯性:
關聯性 | 操作符 |
左 | [ |
- | ++ -- |
- | ~ – (int) (float) (string) (array) (object) @ |
- | instanceof |
右 | ! |
左 | * / % |
左 | + - . |
左 | << >> |
- | < <= > >= |
- | == != === !== |
左 | & |
左 | ^ |
左 | | |
左 | && |
左 | || |
左 | ? : |
右 | = += –= *= /= .= %= &= |= ^= <<= >>= |
左 | and |
左 | xor |
左 | or |
左 | , |
修正:
2010年04月06日 —— Siemen
1. 代碼部分使用csdn代碼重新插入