簡介:運算符是能夠經過給出的一或多個值(用編程行話來講,表達式)來產生另外一個值的東西。因此能夠認爲函數或任何會返回一個值(例如 print)的結構是運算符,而那些沒有返回值的(例如 echo)是別的東西。 有三種類型的運算符。第一種是一元運算符,只運算一個值,例如 !(取反運算符)或 ++(加一運算符)。第二種是有限二元運算符,PHP 支持的大多數運算符都是這種。 第三種是三元運算符:?:。它應該被用來根據一個表達式在另兩個表達式中選擇一個,而不是用來在兩個語句或者程序路線中選擇。把整個三元表達式放在擴號裏是個很好的主意。 php
1、運算符優先級
php運算符優先級和咱們學的數學大體相同,例如,表達式 1 + 5 * 3 的結果是 16 而不是 18 是由於乘號(「*」)的優先級比加號(「+」)高。必要時能夠用括號來強制改變優先級。例如:(1 + 5) * 3 的值爲18。若是運算符優先級相同,則使用從左到右的左聯順序。 下表從高到低列出了運算符的優先級。同一行中的運算符具備相同優先級,此時它們的結合方向決定求值順序。 左聯表示表達式從左向右求值,右聯相反。 linux
結合方向 |
運算符 |
附加信息 |
非結合 |
clone new |
clone 和 new |
左 |
[ |
array() |
非結合 |
++ – |
遞增/遞減運算符 |
非結合 |
~ – (int) (float) (string) (array) (object) (bool) @ |
類型 |
非結合 |
instanceof |
類型 |
右結合 |
! |
邏輯操做符 |
左 |
* / % |
算術運算符 |
左 |
+ – . |
算術運算符和字符串運算符 |
左 |
<< >> |
位運算符 |
非結合 |
< <= > >= <> |
比較運算符 |
非結合 |
== != === !== |
比較運算符 |
左 |
& |
位運算符和引用 |
左 |
^ |
位運算符 |
左 |
| |
位運算符 |
左 |
&& |
邏輯運算符 |
左 |
|| |
邏輯運算符 |
左 |
? : |
三元運算符 |
右 |
= += -= *= /= .= %= &= |= ^= <<= >>= |
賦值運算符 |
左 |
and |
邏輯運算符 |
左 |
xor |
邏輯運算符 |
左 |
or |
邏輯運算符 |
左 |
, |
多處用到 |
2、算數運算符
算數運算符和數學徹底同樣,看下錶便可。 shell
例子 |
名稱 |
結果 |
-$a |
取反 |
$a 的負值。 |
$a + $b |
加法 |
$a 和 $b 的和。 |
$a – $b |
減法 |
$a 和 $b 的差。 |
$a * $b |
乘法 |
$a 和 $b 的積。 |
$a / $b |
除法 |
$a 除以 $b 的商。 |
$a % $b |
取模 |
$a 除以 $b 的餘數 |
注意:除法運算符老是返回浮點數。只有在下列狀況例外:兩個操做數都是整數而且正好能整除,這時它返回一個整數。取模運算符的操做數在運算以前都會轉換成整數(除去小數部分)。 取模 $a % $b 在 $a爲負值時的結果也是負值。 要注意變量的大小,好比3333333333 % 3值不是0; 編程
3、賦值運算符
=應該都熟悉吧,咱們一開始就開始用了,這個就是賦值運算符了。它意味着把右邊表達式的值賦給左邊的運算數。賦值運算表達式的值也就是所賦的值。也就是說,「$a = 3」的值是 3。 賦值運算符能夠和不少其餘運算符結合生成組合運算符好比+=,-=,*=,.=等等,他表示的是左邊的變量和右邊的變量運算事後賦值給左邊的變量。好比$a+=$b 等同於$a = $a+$b; 爲了運算過程清晰,我我的認爲儘可能不要使用$a .=$b .=$c這種結構。你們能夠試試下面的代碼,看看是否是和你們想的結果同樣。若是不同對比下運算符優先級表,再思考一下。 數組
4、位運算符
我以爲在個人工做中位運算符用的很少,因此大體介紹下吧,遇到了再仔細研究研究。 安全
例子 |
名稱 |
結果 |
$a & $b |
And(按位與) |
將把 $a 和 $b 中都爲 1 的位設爲 1。 |
$a | $b |
Or(按位或) |
將把 $a 或者 $b 中爲 1 的位設爲 1。 |
$a ^ $b |
Xor(按位異或) |
將把 $a 和 $b 中不一樣的位設爲 1。 |
~ $a |
Not(按位非) |
將 $a 中爲 0 的位設爲 1,反之亦然。 |
$a << $b |
Shift left(左移) |
將 $a 中的位向左移動 $b 次(每一次移動都表示「乘以 2」)。 |
$a >> $b |
Shift right(右移) |
將 $a 中的位向右移動 $b 次(每一次移動都表示「除以 2」)。 |
5、比較運算符
這個比較好理解,就是比大小了。 函數
例子 |
名稱 |
結果 |
$a == $b |
等於 |
TRUE,若是 $a 等於 $b。 |
$a === $b |
全等 |
TRUE,若是 $a 等於 $b,而且它們的類型也相同。(PHP 4 引進) |
$a != $b |
不等 |
TRUE,若是 $a 不等於 $b。 |
$a <> $b |
不等 |
TRUE,若是 $a 不等於 $b。 |
$a !== $b |
非全等 |
TRUE,若是 $a 不等於 $b,或者它們的類型不一樣。(PHP 4 引進) |
$a < $b |
小與 |
TRUE,若是 $a 嚴格小於 $b。 |
$a > $b |
大於 |
TRUE,若是 $a 嚴格 $b。 |
$a <= $b |
小於等於 |
TRUE,若是 $a 小於或者等於 $b。 |
$a >= $b |
大於等於 |
TRUE,若是 $a 大於或者等於 $b。 |
注意:若是比較一個整數和字符串,則字符串會被轉換爲整數。若是比較兩個數字字符串,則做爲整數比較。此規則也適用於
switch 語句。
對於多種類型,比較運算符根據下表比較(按順序)。 spa
6、三元運算符
$a?$b:$c;好像是惟一的三元運算符,其實等同於 .net
他表示的是表達式 ($a) ? ($b) : ($c) 在 $a 求值爲 TRUE 時的值爲 $b,在 $a 求值爲 FALSE時的值爲 $c。 和組合運算符同樣,我也不建議你們把三元運算符堆積在一塊兒使用,這樣會形成運算結果不清晰。 code
7、錯誤控制運算符
錯誤控制是指抑制錯誤輸出,即當在某條語句前放置@之後若是該語句出錯將被忽略。 注意:目前的「@」錯誤控制運算符前綴甚至使致使腳本終止的嚴重錯誤的錯誤報告也失效。這意味着若是在某個不存在或類型錯誤的函數調用前用了「@」來抑制錯誤信息,那腳本會沒有任何跡象顯示緣由而死在那裏。 注意:@ 運算符只對表達式有效。對新手來講一個簡單的規則就是:若是能從某處獲得值,就能在它前面加上 @ 運算符。例如,能夠把它放在變量,函數和 include() 調用,常量,等等以前。不能把它放在函數或類的定義以前,也不能用於條件結構例如 if 和 foreach等。
8、執行運算符
該運算符是「即1左邊的那個按鍵。能夠實現相同功能的函數是 shell_exec()。看例子
1 |
$output = `ls -al`;//linux使用 |
2 |
$output2 = `dir`;//win使用 |
注意:反引號運算符在激活了安全模式或者關閉了 shell_exec() 時是無效的。
9、遞增/遞減運算符
遞增即加1,遞減即減1 注意:遞增/遞減運算符不影響布爾值。遞減 NULL 值也沒有效果,可是遞增 NULL的結果是 1。
例子 |
名稱 |
效果 |
++$a |
前加 |
$a 的值加一,而後返回 $a。 |
$a++ |
後加 |
返回 $a,而後將 $a 的值加一。 |
–$a |
前減 |
$a 的值減一, 而後返回 $a。 |
$a– |
後減 |
返回 $a,而後將 $a 的值減一。 |
試試下面的代碼看看是否是和本身想的同樣,若是不同再回去對照下上表,仔細思考下
其實只要抓住一個規律,–$a 這種符號在前的等同於$a = $a-1;先算掉,而後在把$a代入到表達式中。另外字母其實也是能夠++ –的,這個你們本身去試試吧。
10、邏輯運算符
例子 |
名稱 |
結果 |
$a and $b |
And(邏輯與) |
TRUE,若是 $a 與 $b 都爲 TRUE。 |
$a or $b |
Or(邏輯或) |
TRUE,若是 $a 或 $b 任一爲 TRUE。 |
$a xor $b |
Xor(邏輯異或) |
TRUE,若是 $a 或 $b 任一爲 TRUE,但不一樣時是。 |
! $a |
Not(邏輯非) |
TRUE,若是 $a 不爲 TRUE。 |
$a && $b |
And(邏輯與) |
TRUE,若是 $a 與 $b 都爲 TRUE。 |
$a || $b |
Or(邏輯或) |
TRUE,若是 $a 或 $b 任一爲 TRUE。 |
注意:and和&&以及或和||雖然意義是同樣的,可是他們的運算優先級是不同的。
還有要注意的一點是短路現象,當&&的左邊已經爲false的時候,and的右邊不在去計算,當||的左邊已是true的時候||的右邊再也不去計算。看下面的例子
是否是i’m here 不必定出現?這就表明了,test不必定運行。另外注意下下面的這段代碼,想一下爲何
1 |
$test = true and false; // $test === true |
2 |
$test = (true and false); // $test === false |
3 |
$test = true && false; // $test === false |
11、字符串運算符
這個咱們在前面幾篇文章的時候就用過了,就是那個「.」了,下面的例子用了他的兩種形式,注意觀察,前面也講過了,這裏不在贅述
12、數組運算符
例子 |
名稱 |
結果 |
$a + $b |
聯合 |
$a 和 $b 的聯合。 |
$a == $b |
相等 |
若是 $a 和 $b 具備相同的鍵/值對則爲 TRUE。 |
$a === $b |
全等 |
若是 $a 和 $b 具備相同的鍵/值對而且順序和類型都相同則爲 TRUE。 |
$a != $b |
不等 |
若是 $a 不等於 $b 則爲 TRUE。 |
$a <> $b |
不等 |
若是 $a 不等於 $b 則爲 TRUE。 |
$a !== $b |
不全等 |
若是 $a 不全等於 $b 則爲 TRUE。 |
注意:+ 運算符把右邊的數組元素(除去鍵值與左邊的數組元素相同的那些元素)附加到左邊的數組後面,可是重複的鍵值不會被覆蓋。
數組中的單元若是具備相同的鍵名和值則比較時相等。看下面的例子(不少例子我不會直接給出答案,因此請你們本身運行下)
1 |
$a = array("趴樹上的豬","qaforcode.net"); |
2 |
$b = array(1=>"qaforcode.net",0=>"趴樹上的豬"); |
數組運算符還有不少博大精深的函數,之後再介紹。
十3、類型運算符
instanceof 用於肯定一個 PHP 變量是否屬於某一類 (class,包括父類) 的實例:
注意:instanceof 運算符是 PHP 5 引進的。在此以前用 is_a(),可是 is_a() 已通過時了,最好用instanceof。另外不能使用!instanceof,可是能夠用!($a instanceof $b)效果是同樣的,這裏爲了運算前後清晰加上小括號,其實是不用的。
試試下面的例子吧
05 |
class MyClass extends ParentClass |
11 |
var_dump($a instanceof MyClass); |
12 |
var_dump( !($a instanceof ParentClass)); |
18 |
class ZhugeClass implements MyInterface |
25 |
var_dump($a instanceof $b); |
本文固定連接: http://www.qaforcode.net/archives/233 | 豬哥每日一貼