本章將介紹PHP的運算子。
運算子這個問題在每種語言裡都有,因為我們已經熟悉了程式設計語言裡的一種或是多種,所以只需要瞭解一下就行了。
概括一下吧。
PHP運算子有很多種,看樣子要比C/C++,C#等語言多多了。分別是:
算術運算子 賦值運算子 位元運算符 比較子 錯誤控制運算子 執行運算子 遞增/遞減運算子 邏輯運算子 字串運算子 數組運算子 類型運算子 這也是蠻多的,五花八門的。
算術運算子
| 例子 |
名稱 |
結果 |
| -$a |
取反 |
$a 的負值。 |
| $a + $b |
加法 |
$a 和 $b 的和。 |
| $a - $b |
減法 |
$a 和 $b 的差。 |
| $a * $b |
乘法 |
$a 和 $b 的積。 |
| $a / $b |
除法 |
$a 除以 $b 的商。 |
| $a % $b |
模數 |
$a 除以 $b 的餘數。 |
位元運算符
| 例子 |
名稱 |
結果 |
| $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” )。 |
比較子
| 例子 |
名稱 |
結果 |
| $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。 |
遞增/遞減運算子
| 例子 |
名稱 |
效果 |
| ++$a |
前加 |
$a 的值加一,然後返回 $a。 |
| $a++ |
後加 |
返回 $a,然後將 $a 的值加一。 |
| --$a |
前減 |
$a 的值減一, 然後返回 $a。 |
| $a-- |
後減 |
返回 $a,然後將 $a 的值減一。 |
邏輯運算子
| 例子 |
名稱 |
結果 |
| $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。 |
數組運算子
| 例子 |
名稱 |
結果 |
| $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。 |
當然還有幾種類型的沒有列出,將在後面描述。我們先看看列出的吧。
如果沒有對上面的運算子做特殊說明,那麼說明它們和C#裡的相似。
首先看看位元運算裡的左移(<<)或右移(>>),其實沒有什麼不同,只是符號不一樣而已。 看看比較運演算法裡的“==”,“===”,這兩個比較有意思,它們有什麼區別呢? 看看一下代碼:
1 2 var_dump ( 0 == " a " ); // 0 == 0 -> true
3 var_dump ( " 1 " == " 01 " ); // 1 == 1 -> true
4
5 switch ( " a " ) {
6 case 0 :
7 echo " 0 " ;
8 break ;
9 case " a " : // never reached because "a" is already matched with 0
10 echo " a " ;
11 break ;
12 }
看第2行,為什麼0會等於“a”呢?奇怪了。之所以會相等,是因為在PHP裡,如果整型和字串比較時,字串會自動的轉化為數值。這裡就會有一個問題:字串轉化為數值的原則是什嗎?原則是
1)如果包括“.”,“e”或“E”其中任何一個字元的話,字串被當作 float 來求值。否則就被當作整數。
2)該值由字串最前面的部分決定。如果字串以合法的數字資料開始,就用該數字作為其值,否則其值為 0(零)。合法數字資料由可選的加號或減號開始,後面跟著一個或多個數字(可選地包括十進位分數),後面跟著可選的指數。指數是一個“e”或者“E”後面跟著一個或多個數字。例如:
1 2 $var = 1 + " 10.5 " ;
3 echo " 1 + \ " 10.5 \ " = " . $var . " ; type: " . gettype ( $var ) . "
" ;
4 $var = 1 + " -1.3e3 " ;
5 echo " 1 + \ " - 1.3e3 \ " = " . $var . " ; type: " . gettype ( $var ) . "
" ;
6 $var = 1 + " bob-1.3e3 " ;
7 echo " 1 + \ " bob - 1.3e3 \ " = " . $var . " ; type: " . gettype ( $var ) . "
" ;
8 $var = 1 + " bob3 " ;
9 echo " 1 + \ " bob3\ " = " . $var . " ; type: " . gettype ( $var ) . "
" ;
10 $var = 1 + " 10 beatiful birds " ;
11 echo " 1 + \ " 10 beatiful birds\ " = " . $var . " ; type: " . gettype ( $var ) . "
" ;
12 $var = 4 + " 10.2 Little Apple " ;
13 echo " 4 + \ " 10.2 Little Apple\ " = " . $var . " ; type: " . gettype ( $var ) . "
" ;
14 $var = " 10.0 pigs " + 1 ;
15 echo " \ " 10.0 pigs \ " + 1= " . $var . " ; type: " . gettype ( $var ) . "
" ;
16 $var = " 10.0 pigs " + 1.0 ;
17 echo " \ " 10.0 pigs \ " + 1.0= " . $var . " ; type: " . gettype ( $var ) . "
" ;
18 ?>
19
輸出的結果是:
1 + " 10.5 " = 11.5 ; type : double
1 + " -1.3e3 " =- 1299 ; type : double
1 + " bob-1.3e3 " = 1 ; type : integer
1 + " bob3 " = 1 ; type : integer
1 + " 10 beatiful birds " = 11 ; type : integer
4 + " 10.2 Little Apple " = 14.2 ; type : double
" 10.0 pigs " + 1 = 11 ; type : double
" 10.0 pigs " + 1.0 = 11 ; type : double
現在明白是怎麼回事了吧。為什麼“a”為0就是這個道理。
既然如此,還有一個“===”,3個等於符號,它表示不僅最後轉化的數值相等,而且類型也應該相等。看看下面的代碼:
1 2 var_dump ( 0 === " a " ); // 0 === 0 -> false
3 echo '
' ;
4 var_dump ( 0 === " 00 " ); // 0 === "00" -> false
5 echo '
' ;
6 var_dump ( 0 === 0 ); // 0 === 0 -> true
7 echo '
' ;
8 ?>
輸出結果為:
bool( false )
bool( false )
bool( true )
第6行之所以為true,是因為它們不僅數值相等,而且類型也一樣。
3)看看邏輯運算,“或”和“與”居然有2種寫法,如果你使用C/C++,C#,Java等語言的話,就用“&&"或”||"吧。如果你是VB的話,就用and,和or。當然你也可以2種都用。它們有什麼區別呢?優先順序的不同而已。”&&“與"||"比”and“和”or“優先順序要高。
4).PHP多了一個數組運算子。有了上面的解釋,相信它們不是很難了。
賦值運算子 和C#語言一樣,也是利用”=“,也是利用二元符號賦值。例如:
$a = ' hello ' ; // $a是hello。
$a += 1 ; // $a是1,二元賦值符
$b = ' world ' ;
$c = ' hello ' ;
$c .= $b ; // $c是"hello world"
?>
錯誤執行運算子 PHP 支援一個錯誤控制運算子:@。當將其放置在一個 PHP 運算式之前,該運算式可能產生的任何錯誤資訊都被忽略掉。
如果啟用了 track_errors 特性,運算式所產生的任何錯誤資訊都被存放在變數 $php_errormsg 中。此變數在每次出錯時都會被覆蓋,所以如果想用它的話就要儘早檢查。例如:
/* Intentional file error */
$my_file = @ file ( ' non_existent_file ' ) or
die ( " Failed opening file: error was '$php_errormsg' " );
// this works for any expression, not just functions:
$value = @ $cache [ $key ];
// will not issue a notice if the index $key doesn't exist.
?>
執行運算子 PHP 支援一個執行運算子:反引號(``)。注意這不是單引號!PHP 將嘗試將反引號中的內容作為外殼命令來執行,並將其輸出資訊返回(例如,可以賦給一個變數而不是簡單地丟棄到標準輸出)。使用反引號運算子“`”的效果與函數 shell_exec() 相同。反引號位於鍵盤的”~“鍵那裡。例如:
1 2 $out = ` dir c : `;
3 echo '
' . $out . '
' ;
4 ?>
結果為:
Volume in drive C has no label .
Volume Serial Number is A019 - 7D77
Directory of C : \
02 / 24 / 2006 10 : 21 PM Downloads
02 / 24 / 2006 10 : 09 PM Kingsoft Temp Download
05 / 13 / 2006 07 : 07 PM 220 cmd . txt
02 / 13 / 2006 11 : 40 PM WINDOWS
02 / 13 / 2006 11 : 47 PM Documents and Settings
02 / 13 / 2006 11 : 57 PM Program Files
06 / 24 / 2006 11 : 01 PM 482 , 933 nfzmLog . log
05 / 11 / 2006 10 : 28 PM Inetpub
05 / 13 / 2006 07 : 07 PM 4 response . txt
07 / 29 / 2006 05 : 56 PM 0 Rec . pcm
06 / 24 / 2006 09 : 05 PM nf
07 / 29 / 2006 05 : 56 PM 0 WriteAudrv . wav
07 / 04 / 2006 08 : 52 PM dwnSetup
07 / 08 / 2006 09 : 28 AM TEMP
02 / 14 / 2006 12 : 15 AM NVIDIA
5 File (s) 483 , 157 bytes 10 Dir (s) 2 , 116 , 558 , 848 bytes free
遞增/遞減運算子
PHP 支援 C 風格的前/後遞增與遞減運算子。
注: 遞增/遞減運算子不影響布爾值。遞減 NULL 值也沒有效果,但是遞增 NULL 的結果是 1。
遞增/遞減運算子
例子 名稱 效果
| ++$a |
前加 |
$a 的值加一,然後返回 $a。 |
| $a++ |
後加 |
返回 $a,然後將 $a 的值加一。 |
| --$a |
前減 |
$a 的值減一, 然後返回 $a。 |
| $a-- |
後減 |
返回 $a,然後將 $a 的值減 |
類型運算子
PHP 有一個類型運算子:instanceof。instanceof 用來測定一個給定的對象是否來自指定的對象類。
instanceof 運算子是 PHP 5 引進的。在此之前用 is_a(),但是 is_a() 已經過時了,最好用 instanceof。
C#裡是is,而Java是instanceof,和PHP一樣。例如:
1 2 class A { }
3 class B { }
4
5 $thing = new A;
6
7 if ( $thing instanceof A) {
8 echo ' A ' ;
9 }
10 if ( $thing instanceof B) {
11 echo ' B ' ;
12 }
13 ?>
字元運算子 有兩個字串運算子。第一個是串連運算子(“.”),它返回其左右參數串連後的字串。第二個是串連賦值運算子(“.=”),它將右邊參數附加到左邊的參數後。這些在前面已經見到,就不舉例了。